Node和Chrome中的块范围内的const(V8)

时间:2016-02-05 22:47:29

标签: javascript node.js scope const v8

我正在编写一个nodejs(v4.2.4)app我遇到了一些奇怪的行为。

function A(number) {
 this.number = number;
}

for(var i = 0; i < 3; i++) {
  const a = new A(i);

  console.log(a.number);
}

const b = new A(99);
console.log(b.number);

我的直觉来自Java(和FireFox之一),输出应该是

0
1
2
99

然而,Node(和Chrome)给了我

0
0
0
99

我从MSN - block scope调查并了解var在javascript中没有块范围。进一步看,MSN - const将const声明描述为具有块范围:

  

常量是块作用域的,就像使用let语句定义的变量一样。常量的值不能通过重新赋值来改变,也不能重新声明。

在这种情况下,我会说Node和Chrome(在这种情况下可能是V8)在块作用域中对const进行某种阴影处理。但他们也写了

  

此声明创建一个常量,该常量可以是声明它的函数的全局变量或局部变量。

这是否意味着V8会将每个const声明作为全局变量,而FireFox会创建一个本地变量?如此重要的事情怎么能以不同的方式实施呢?

2 个答案:

答案 0 :(得分:5)

v8需要use strict指令才能启用此行为。这在最新版本中已更改:http://v8project.blogspot.ru/2016/01/v8-release-49.html

引用:

  

Release 4.9还可以生成块级构造,例如类,并且在严格模式之外可用

这也适用于const

答案 1 :(得分:-4)

默认情况下,Chrome不支持ES6。您引用的const行为来自ES6规范。

Chrome中的奇怪const行为是非标准行为,既不是ES5(根本没有此类功能),也不是ES6。

基本测试失败:https://kangax.github.io/compat-table/es6/

const必须具有本地区块范围。