Node.js 模块和函数中“this”的含义

2024-01-08

我有一个 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 文件是required 作为 Node 模块,Node 引擎在包装函数内运行模块代码。该模块包装函数是通过this set to module.exports。 (回想一下,上面的函数可以用任意的this value.)

这样,你就会得到不同的this值,因为每个this驻留在不同的函数内:第一个位于 Node 创建的模块包装函数内,第二个位于aFunction.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 模块和函数中“this”的含义 的相关文章

随机推荐