node.js和Chrome的V8引擎有什么区别?

4

Chrome 版本 49.0.2623.110 m。

Node.js 版本 v5.10.0。

这是我的代码:

var a = 0;

(function() {
    this.a = 1;
    this.b = 2;
    console.log(a);
} )();

console.log(a);
console.log(b);

Chrome提供

1
1
2

节点提供
0
0
2

为什么会发生这种情况?

谢谢


1
这与V8无关,而是与Node和浏览器中全局作用域的工作方式有关(在浏览器中全局作用域是window)。尝试使用控制台记录“this”,就会变得清晰明了。 - adeneo
1个回答

11

当在非严格模式下调用函数但没有上下文时,this默认为全局对象。

在浏览器中,源代码的顶层运行在全局上下文中,因此this.a(即window.a)与在顶部声明的全局上下文中的var a相同。赋值this.a = 1等同于赋值a = 1

在 node.js 中,每个 JavaScript 文件都有自己独立的模块上下文,与全局上下文分开,因此var a=0;不会创建全局变量,而使用this.a = 1;创建的全局变量将被模块自己的a所遮蔽。


因此,在Node中,console.log(b)在作用域链中向上获取b,从模块到全局。而在浏览器中,代码直接在全局作用域中执行。 - Eu Insumi Prunc
在 Node 中,代码位于模块作用域中,而在浏览器中,代码位于全局作用域中。谢谢。 - Eu Insumi Prunc
@EuInsumiPrunc 是的,两者中的 b 是相同的,因为在模块中没有声明 b 来掩盖全局变量。 - Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接