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

Sim*_*ton 9 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);
        }
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述


Statements/const更新

此声明创建一个常量,该常量可以是声明它的函数的全局或局部.常量是块范围的.

geo*_*org 8

当您修改"不可变绑定"时,当前草稿仅在严格模式下抛出:

正如@kangax指出的那样,一个常量的重新分配应该总是抛出,因为在(这里)const创建一个带有strict标志的"不可变绑定" :

如果d的IsConstantDeclaration为真,那么

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

随后:

SetMutableBinding(N,V,S)......

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

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

"use strict";

const e = 0;
e = 42;  // SyntaxError: Assignment to constant variable.
Run Code Online (Sandbox Code Playgroud)

(目前尚不清楚为什么这是"SyntaxError")...

在非严格模式下,静默忽略对常量的赋值:

const e = 0;
e = 42;
console.log(e); // 0
Run Code Online (Sandbox Code Playgroud)

使用带有--harmony标志的节点v0.10.35进行测试.

  • 您还可以在我们的compat表中看到确切的支持细分 - https://kangax.github.io/compat-table/es6/#const - 其中显示"重新定义const是一个错误"实际上在Chrome中缺少那个时刻(这正是OP正在经历的,我猜) (2认同)