我在本地安装了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吗?
你能解释一下为什么Node.js在全局范围内看不到x吗?
如果您在Node控制台中运行它,它会。如果将其作为文件在中运行,则x
在文件的作用域中,而不是全局作用域。
顺便说一句,在Node中,可以使用global
显式查看全局范围,就像在浏览器中使用window
一样。因此,
console.log(global == this)
将根据您是在文件中还是在控制台中运行它,给出两个不同的答案。
此外,请尝试迁移到let
和const
。这是特别令人困惑的,因为var
在全局范围和其他地方的行为不同。在控制台和浏览器中,外部var x
位于全局范围内,因此它定义了一个全局变量(window.x
和global.x
(。在Node文件中,var x
不在全局作用域中,因此它执行不在全局范围中时的正常操作:定义局部变量x
(不是this.x
,不是global.x
,只有x
(。因此,您有两个局部变量,内部变量遮蔽外部变量,这使得外部变量不可访问。同时,this.x
从未被定义。
在chrome中,this
是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
。