2

我在本地安装了 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 ?

4

2 回答 2

7

您能否向我解释一下,为什么 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从未被定义。

于 2018-07-24T08:03:53.193 回答
3

在 chromethis中是一个对象,Window就好像this.constructor.name你得到Window一个构造函数名称一样,因此在访问this.x它时会查找全局变量x并且不引用函数范围。

var x = 1;

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

     console.log(`local x = ${x}`);
     console.log('Constructor ', this.constructor.name);
     console.log(`global x = ${this.x}`);
}

fn(10);

但是,在 NodeJS 中,this总是会引用函数原型(而不是全局范围)。因此,您没有任何x与函数关联的值prototype,因此它为您提供undefined.

于 2018-07-24T08:06:27.287 回答