节点和Chrome中的块范围内的const(V8)
我写了一个nodejs(v4.2.4)应用程序,我遇到了一些奇怪的行为。
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的调查和了解块范围 ,该var
在JavaScript中没有块范围。 进一步来看 , MSN – const将const声明描述为具有块范围:
常量是块范围的,就像使用let语句定义的variables一样。 一个常量的值不能通过重新赋值而改变,并且不能被重新声明。
在这种情况下,我会说Node和Chrome(在这种情况下可能是V8),在块范围中有一些对const
的阴暗处理。 但他们也写这个
这个声明创build一个常量,它可以是声明它的函数的全局或局部的。
这是否意味着V8将每个const
声明作为一个全局variables,而FireFox创build一个本地variables? 怎么可能这样重要的东西实现如此不同呢?
v8需要use strict
指令来启用此行为。 这已在最新版本中更改: http : //v8project.blogspot.ru/2016/01/v8-release-49.html
引用:
版本4.9也使块级结构,如类和让严格模式之外的可用
这也应该适用于const
Chrome默认不支持ES6。 您引用的常量行为是来自ES6规范。
在Chrome中奇怪的const
行为是不标准的,在ES5(也就是根本就没有这个特性)和ES6中都没有。
基本testing失败: https : //kangax.github.io/compat-table/es6/
const
必须有本地,块范围。