在Node.js和Browser中对'this'的不同处理

Pro*_*gni 2 javascript this global-scope node.js

我在本地安装了Node.js v8.10.0.我写了一个简单的脚本来玩'this':

var x = 1;

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

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

fn(10);
Run Code Online (Sandbox Code Playgroud)

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

local x = 10

global x = undefined
Run Code Online (Sandbox Code Playgroud)

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

local x = 10

global x = 1
Run Code Online (Sandbox Code Playgroud)

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

Ama*_*dan 7

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

如果您在Node控制台中运行它,它会.如果您将其作为文件运行,x则位于文件的范围内,而不是全局范围.

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

console.log(global == this)
Run Code Online (Sandbox Code Playgroud)

将根据您是在文件中还是在控制台中运行它来给出两个不同的答案.

此外,尝试迁移到letconst.这更令人困惑,因为var在全球范围和其他地方表现不同.在控制台和浏览器中,您的外部var x位于全局范围内,因此它定义了一个全局变量(window.xglobal.x).在Node文件中,var x不在全局范围内,因此它在不在全局范围内时执行通常所做的操作:定义局部变量x(不是this.x,不是global.x,只是x).因此,您有两个局部变量,内部变量遮蔽外部变量,这使得外部变量不可访问.同时,this.x从未定义过.