您必须了解以下一些基本事实才能弄清情况:
在Node模块的顶级代码中,this
等效于module.exports
。那是您看到的空对象。
当您使用this
一个函数内,价值this
就是重新确定之前, 每个执行 的功能,并且它的值由下式确定_如何_执行该功能。这意味着this
如果调用机制不同(例如aFunction()
vs. aFunction.call(newThis)
vs. emitter.addEventListener("someEvent", aFunction);
等),则完全相同的函数对象的两次调用可能具有不同的值。在您的情况下,aFunction()
在非严格模式下运行this
设置为全局对象的函数。
当将JavaScript文件require
作为Node模块时,Node引擎在包装函数内部运行模块代码。该模块包装函数的this
设置为module.exports
。(回想一下,函数可以使用任意this
值运行。)
因此,您将获得不同的this
值,因为每个值都this
驻留在不同的函数内:第一个位于Node创建的module-wrapper函数内部,而第二个位于中aFunction
。