在es6中使用const作为循环

siv*_*636 4 javascript ecmascript-6

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

for (const x of [1,2,3]){
console.log(x);
}
Run Code Online (Sandbox Code Playgroud)

Ori*_*iol 6

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

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

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

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

因此,如果在上面的示例中,它们会引发错误const.


运行时语义:ForIn/OfBodyEvaluation说:

  1. 重复
    1. 其他
      1. 断言:lhsKind是lexicalBinding.
      2. 断言:lhsForDeclaration.
      3. iterationEnvNewDeclarativeEnvironment(oldEnv).
      4. 对于传递iterationEnv作为参数的lhs执行BindingInstantiation.

所以每次迭代都应该创建一个新的绑定.Chrome是正确的.