我最近一直在尝试使用node.js,然后我遇到了一个有关在模块全局作用域中使用this
的奇怪行为。
this
在模块全局作用域中被绑定到module.exports。
console.log(this === exports); // -> true
但是在方法作用域中,this
被绑定到全局对象:
(function() { console.log(this === global); })(); // -> true
这也导致了这种令人困惑的行为:
this.Foo = "Weird";
console.log(Foo); // -> throws undefined
(function() { this.Bar = "Weird"; })();
console.log(Bar); // -> "Weird"
我猜解决方案是永远不要在全局范围内使用this
,而是明确使用extends
或global
代替,但这背后是否有逻辑或者是node.js的一个错误或限制呢?
this
绑定到global
而不是extends
,那么会不会更清晰一些呢?我期望在全局范围和静态函数范围中,this
的含义是相同的。 - Jeff Cyrthis
的工作原理。我没有阅读任何关于它的讨论,但我猜在全局范围内有this === exports
应该类似于在浏览器的全局范围内有this === window
。在我看来,在全局范围内有this === global
就没那么有意义了,因为那意味着this.foo === foo
。 - Linus Thieltrue
,所以我认为实际上this === global
更合乎逻辑。 - pimvdb