ES6为什么我可以在循环中定义时重新分配常量

时间:2015-02-05 12:46:25

标签: javascript ecmascript-6

我正在玩一些无意义的逻辑来更好地理解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);
        }

这是预期的行为吗?任何人都可以解释为什么会发生这种情况,循环中的声明会不同吗?

enter image description here


Statements/const

更新
  

此声明创建一个可以是全局或本地的常量   声明它的函数。常量是块范围的。

1 个答案:

答案 0 :(得分:8)

当您修改&#34;不可变绑定&#34;时,current draft仅在严格模式下抛出:

正如@kangax指出的那样,一个常量的重新分配应该总是抛出,因为const创建了一个&#34;不可变的绑定&#34;使用strict标记(here):

  

如果d的IsConstantDeclaration为真,那么

     

调用env的CreateImmutableBinding具体方法,将dn和true作为参数传递。

then

  

SetMutableBinding(N,V,S)   ...

     
      
  1. 否则,如果envRec中N的绑定是可变绑定,则将其绑定值更改为V.
  2.   
  3. 否则这必须是尝试更改不可变绑定的值,所以如果S为true则抛出TypeError异常。
  4.   

但是,节点仅以严格模式抛出:

"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进行测试。