我最近一直在使用node.js,在一个模块的全局范围内,我遇到了一个关于这个问题的奇怪行为.
这在全局范围内绑定到module.exports:
console.log(this === exports); // -> true
但是这在一个方法范围内绑定到全局:
(function() { console.log(this === global); })(); // -> true
这也导致了这个混乱的行为:
this.Foo = "Weird"; console.log(Foo); // -> throws undefined (function() { this.Bar = "Weird"; })(); console.log(Bar); // -> "Weird"
我想这个解决方案是永远不会在全局范围内使用,而是显式地使用extends或global,但是这是否存在一个逻辑,或者是node.js中的错误或限制?
解决方法
在一个简单的CommonJS模块实现中,我不得不考虑在模块的全局范围内如何处理这个问题;它不符合规格.
我也首先将其设置为出口对象,因为我认为这将是有用的,但后来found some code我需要“模拟”,正在使用它来获取全局对象的句柄,所以我将其更改为全局提供尽可能靠近环境的“正常”模块代码.
我们只能猜测为什么节点设置的方式是(或者询问作者),但是我的猜测是这样做,只是因为它似乎是一个有用的想法,类似于给模块对象一个导出属性的方式在节点中并将其反映在模块的实际导出中(此行为也不是规范的一部分,但也不会反对它).
关于这个引用全局函数的问题的一部分,正如其他答案所解释的那样,这只是它的工作原理;这不是一个节点特定的行为,这是一个奇怪的JavaScript行为.