javascript - 在 es6 for of 循环中使用 const

标签 javascript ecmascript-6

虽然 x 不是常量,但以下代码如何运行而不会出现任何错误?

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

最佳答案

它适用于 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. Repeat
    1. Else
      1. Assert: lhsKind is lexicalBinding.
      2. Assert: lhs is a ForDeclaration.
      3. Let iterationEnv be NewDeclarativeEnvironment(oldEnv).
      4. Perform BindingInstantiation for lhs passing iterationEnv as the argument.

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

关于javascript - 在 es6 for of 循环中使用 const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36684191/

相关文章:

javascript - 如何将数组映射到javascript中的对象

javascript - 模块中的模拟导出函数

javascript - 参数上的ES6解构exec函数

angular - 我应该在 Angular 的类中将方法写成箭头函数吗

javascript - 为什么 Vue 子组件中 this.$refs 未定义?

javascript - 如何从javascript中的字符串中删除 ","

javascript - 使用 JavaScript 如何将字符串分解为特定长度,同时保留特殊字符?

javascript - 通过任意数量的参数设置对象的嵌套键/值

javascript - ASP.Net Core 回发后如何保持选项卡处于事件状态

node.js - 如何将单个反斜杠放入 ES6 模板文字的输出中?