我正在编写一个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会创建一个本地变量?如此重要的事情怎么能以不同的方式实施呢?
答案 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
必须具有本地区块范围。