我有一个JavaScript文件,由加载require。
require
// loaded by require() var a = this; // "this" is an empty object this.anObject = {name:"An object"}; var aFunction = function() { var innerThis = this; // "this" is node global object }; aFunction(); (function(anyParameter){ console.log(anyParameter.anObject); })( this // "this" is same having anObject. Not "global" );
我的问题是:this在var中a = this;是一个空对象,而this函数中的语句是node.js全局对象的影子。我知道this关键字在功能上有所不同,但我不明白为什么先this不等于全局,而this在功能上等于全局。
this
a = this;
node.js如何注入global到this函数范围内,为什么不将其注入模块范围内?
global
您必须了解以下一些基本事实才能弄清情况:
在Node模块的顶级代码中,this等效于module.exports。那是您看到的空对象。
module.exports
当您使用this一个函数内,价值this就是重新确定之前, 每个执行 的功能,并且它的值由下式确定_如何_执行该功能。这意味着this如果调用机制不同(例如aFunction()vs. aFunction.call(newThis)vs. emitter.addEventListener("someEvent", aFunction);等),则完全相同的函数对象的两次调用可能具有不同的值。在您的情况下,aFunction()在非严格模式下运行this设置为全局对象的函数。
aFunction()
aFunction.call(newThis)
emitter.addEventListener("someEvent", aFunction);
当将JavaScript文件require作为Node模块时,Node引擎在包装函数内部运行模块代码。该模块包装函数的this设置为module.exports。(回想一下,函数可以使用任意this值运行。)
因此,您将获得不同的this值,因为每个值都this驻留在不同的函数内:第一个位于Node创建的module-wrapper函数内部,而第二个位于中aFunction。
aFunction