我有一个 JavaScript 文件,由以下方式加载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
in var a = this;
是一个空对象,而this
函数中的语句是node.js 全局对象的影子。我知道this
关键字的功能不同,但我首先不明白为什么this
不等于全局且this
在函数中等于全局。
Node.js如何注入global
to this
在函数作用域中,为什么它不将其注入到模块作用域中?
为了澄清情况,您必须了解以下一些基本事实:
在 Node 模块的顶层代码中,this
相当于module.exports
。这就是您看到的空物体。
当你使用this
在函数内部,值this
之前重新确定每一次执行函数的值,其值为取决于how函数被执行 https://stackoverflow.com/questions/12370851/understanding-javascript-scope-with-var-that-this/12371105#12371105。这意味着对完全相同的函数对象的两次调用可能有不同的结果this
如果调用机制不同(例如aFunction()
vs. aFunction.call(newThis)
vs. emitter.addEventListener("someEvent", aFunction);
等)就你而言,aFunction()
在非严格模式下运行该函数this
设置为全局对象。
当 JavaScript 文件是require
d 作为 Node 模块,Node 引擎在包装函数内运行模块代码。该模块包装函数是通过this
set to module.exports
。 (回想一下,上面的函数可以用任意的this
value.)
这样,你就会得到不同的this
值,因为每个this
驻留在不同的函数内:第一个位于 Node 创建的模块包装函数内,第二个位于aFunction
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)