在es6中使用const作为循环

时间:2016-04-18 01:37:34

标签: javascript ecmascript-6

虽然x不是常量,但以下代码如何运行且没有任何错误?

for (const x of [1,2,3]){
console.log(x);
}

1 个答案:

答案 0 :(得分:6)

它适用于Chrome等兼容浏览器,因为它们会在每次迭代时创建一个新的,不同的常量变量:

var arr = [];
for (const x of [1,2,3])
  arr.push(() => x);
arr.map(f => f()); // [1,2,3] on Chrome

一些不兼容的浏览器会重复使用相同的变量:

var arr = [];
for (let x of [1,2,3])
  arr.push(() => x);
arr.map(f => f()); // [3,3,3] on non-compliant browsers

因此,如果在上面的示例中使用const,则会抛出错误。

Runtime Semantics: ForIn/OfBodyEvaluation说:

  
      
  1. 重复      
        
    1. 否则      
          
      1. 断言: lhsKind 是lexicalBinding。
      2.   
      3. 断言: lhs ForDeclaration
      4.   
      5. iterationEnv NewDeclarativeEnvironment oldEnv )。
      6.   
      7. lhs 执行BindingInstantiation传递 iterationEnv 作为参数。
      8.   
    2.   
  2.   

因此每次迭代都应该创建一个新的绑定。 Chrome是正确的。