Node 和 Chrome (V8) 块范围内的 const
const within block scopes in Node and Chrome (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 - block scope that var
does not have block scope in javascript. Looking further, MSN - const 中了解到,虽然将 const 声明描述为具有块范围:
Constants are block-scoped, much like variables defined using the let statement. The value of a constant cannot change through re-assignment, and it can't be redeclared.
在那种情况下,我会说 Node 和 Chrome(在这种情况下可能是 V8)在块作用域中对 const
进行了某种可疑处理。但他们也写道
This declaration creates a constant that can be either global or local to the function in which it is declared.
这是否意味着 V8 将每个 const
声明作为全局变量,而 FireFox 创建一个本地变量?像这样至关重要的事情怎么会以如此不同的方式实施?
Chrome默认不支持ES6。您引用的 const 行为来自 ES6 规范。
Chrome 中奇怪的 const
行为是非标准的,无论是在 ES5(根本没有这样的功能)还是在 ES6 中。
基本测试失败:https://kangax.github.io/compat-table/es6/
const
必须具有本地块作用域。
v8 需要 use strict
指令来启用此行为。这在最新版本中已更改:http://v8project.blogspot.ru/2016/01/v8-release-49.html
引用:
Release 4.9 also makes block level constructs such as class and let available outside of strict mode
这也适用于 const
我正在编写一个 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 - block scope that var
does not have block scope in javascript. Looking further, MSN - const 中了解到,虽然将 const 声明描述为具有块范围:
Constants are block-scoped, much like variables defined using the let statement. The value of a constant cannot change through re-assignment, and it can't be redeclared.
在那种情况下,我会说 Node 和 Chrome(在这种情况下可能是 V8)在块作用域中对 const
进行了某种可疑处理。但他们也写道
This declaration creates a constant that can be either global or local to the function in which it is declared.
这是否意味着 V8 将每个 const
声明作为全局变量,而 FireFox 创建一个本地变量?像这样至关重要的事情怎么会以如此不同的方式实施?
Chrome默认不支持ES6。您引用的 const 行为来自 ES6 规范。
Chrome 中奇怪的 const
行为是非标准的,无论是在 ES5(根本没有这样的功能)还是在 ES6 中。
基本测试失败:https://kangax.github.io/compat-table/es6/
const
必须具有本地块作用域。
v8 需要 use strict
指令来启用此行为。这在最新版本中已更改:http://v8project.blogspot.ru/2016/01/v8-release-49.html
引用:
Release 4.9 also makes block level constructs such as class and let available outside of strict mode
这也适用于 const