我正在玩一些无意义的逻辑来更好地理解ES6,并且在定义常量时注意到了一个奇怪的事情。
在循环中定义时,似乎可以更改常量赋值:
"use strict";
for(const i=0;i<10;i++){ //seting constant in loop
console.log(i); //is reassigned and incremented 0,1,2,3...
}
const e = 0; //setting constant outside loop
for(;e<10;e++){ //cannot reassign constant
console.log(e);
}
这是预期的行为吗?任何人都可以解释为什么会发生这种情况,循环中的声明会不同吗?
此声明创建一个可以是全局或本地的常量 声明它的函数。常量是块范围的。
答案 0 :(得分:8)
当您修改&#34;不可变绑定&#34;时,current draft仅在严格模式下抛出:
正如@kangax指出的那样,一个常量的重新分配应该总是抛出,因为const
创建了一个&#34;不可变的绑定&#34;使用strict
标记(here):
如果d的IsConstantDeclaration为真,那么
调用env的CreateImmutableBinding具体方法,将dn和true作为参数传递。
和then:
SetMutableBinding(N,V,S) ...
- 否则,如果envRec中N的绑定是可变绑定,则将其绑定值更改为V.
- 否则这必须是尝试更改不可变绑定的值,所以如果S为true则抛出TypeError异常。
醇>
但是,节点仅以严格模式抛出:
"use strict";
const e = 0;
e = 42; // SyntaxError: Assignment to constant variable.
(不清楚为什么这是&#34; SyntaxError&#34;)...
在非严格模式下,静默忽略对常量的赋值:
const e = 0;
e = 42;
console.log(e); // 0
使用带有--harmony
标志的节点v0.10.35进行测试。