首页 > 解决方案 > Node.js 和浏览器中对“this”的不同处理

问题描述

我在本地安装了 Node.js v8.10.0。我写了一个简单的脚本来玩“这个”:

var x = 1;

var fn = function (a) {
     var x = a;

     console.log(`local x = ${x}`);
     console.log(`global x = ${this.x}`);
}

fn(10);

当我通过 Node.js 执行脚本时,我得到以下结果:

local x = 10

global x = undefined

当我在 Chrome 中执行脚本时,我得到以下结果:

local x = 10

global x = 1

您能否向我解释一下,为什么 Node.js 在全局范围内看不到 x ?

标签: javascriptnode.jsthisglobal-scope

解决方案


您能否向我解释一下,为什么 Node.js 在全局范围内看不到 x ?

如果您在 Node 控制台中运行它,它确实如此。如果您将其作为文件运行,x则在文件的范围内,而不是全局范围内。

顺便说一句,在 Node 中,您可以使用global显式查看全局范围,就像window在浏览器中使用一样。因此,

console.log(global == this)

根据您是在文件中还是在控制台中运行它,会给您两个不同的答案。

另外,尝试迁移到letconst。这更加令人困惑,因为var在全局范围和其他地方的行为不同。在控制台和浏览器中,您的外部var x在全局范围内,因此它定义了一个全局变量(window.xglobal.x)。在 Node 文件中,var x不在全局范围内,因此它在不在全局范围内时执行通常的操作:定义局部变量x(not this.x、 not global.x、 just x)。因此,您有两个局部变量,内部变量遮蔽了外部变量,这使得外部变量无法访问。同时,this.x从未被定义。


推荐阅读