我有一个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"
);

我的问题是:var a = this;中的this是空对象,而函数中的this条语句是 node 的阴影.js全局对象.我知道this关键字在函数中是不同的,但我不明白为什么第一个this不等于全局,而函数中的this等于全局.

node 是如何工作的.js在函数范围内注入globalthis,为什么不将其注入模块范围?

推荐答案

以下是一些你必须了解的基本事实,以澄清情况:

  • 在 node 模块的顶层代码中,this相当于module.exports.这就是你看到的空物体.

  • 在函数内部使用this时,this的值在函数的each and every execution之前重新确定,其值为determined by how the function is executed.这意味着,如果调用机制不同(例如aFunction() vs.aFunction.call(newThis) vs.emitter.addEventListener("someEvent", aFunction);等),则完全相同的函数对象的两次调用可能会有不同的this值.在您的情况下,aFunction()在非严格模式下运行函数,this设置为全局对象.

  • 当JavaScript文件作为 node 模块存储时, node 引擎会在包装函数中运行模块代码.在this设置为module.exports的情况下调用该模块包装函数.(回想一下,在上面,函数可以使用abitrary this值运行.)

因此,您会得到不同的this个值,因 for each this都位于不同的函数中:第一个在 node 创建的模块包装函数中,第二个在aFunction中.

Node.js相关问答推荐

我的Node.js应用程序没有将Mongoose方法findByIdAndDelete作为函数进行检测

在内存中加载安全密钥安全吗?还是每次都从文件中读取?

Sequelize、postgres和posgis:在n°;公里

通过PutObjectCommand上传AWS S3 PDF文件,结果为空PDF

即使卷已设置,Docker Nodemon 也不会热重载

当API返回400状态代码时,使用Reactjs fetch获取错误消息

如何从动态Typescript 文件加载模块

在 gatsby 中安装软件包时不推荐使用的错误

如何promise AWS JavaScript 开发工具包?

`npm install` 以Killed结尾

Handlebars:访问已被拒绝解析来自的属性,因为它不是其父级的自己的属性

使用 WebSockets 有服务器成本吗?

npm publish 导致'错误:EPERM:不允许操作,取消链接...',errno -4048

如何从 npm 注册表中删除 npm 包?

如何判断 Node.js 中是否设置了环境变量?

Heroku + Node:找不到模块错误

Express js 阻止 GET /favicon.ico

使用 gzip/deflate 压缩的简单 HTTP 请求

从 node.js 连接到 mongodb 时出现 ECONNREFUSED 错误

我无法全局安装 nodemon,nodemon无法识别