【发布时间】:2017-07-20 08:43:36
【问题描述】:
我对 ES6 中 for 循环如何在幕后操作感兴趣。
这是基本示例
var funcs = [];
for (let i = 0; i < 5; i++) {
funcs.push(function () {
console.log(i);
});
};
每个函数都会获得正确的 i 值(从 0 到 4)的原因是因为 let 正在创建 5 个新作用域,并且函数被绑定到它们相应的作用域。这就是我的想法,这对我来说最有意义。如果是这种情况,那么为什么 const 声明 (i) 失败是没有意义的,因为它应该创建 5 个新范围,并且 const 变量可以在不同的范围内愉快地生活。 在 let 之前我们确实使用 IIFE 来达到相同的效果,但是该代码所做的是它基本上为函数创建了新的范围,我认为 let 在幕后做同样的事情。
如果上面的语句不正确,那么一定是 let inside for 循环只创建了一个范围,但我不明白这与 var 声明有何不同以及函数如何获得正确的 i 值。更清楚地说,假设 let 绑定到一个由 for 循环创建的新作用域,并且在这种情况下 var 声明被提升到全局作用域,但这仍然是一个要使用的作用域。
谁能分享一下这个话题?
【问题讨论】:
-
如果您将
i定义为常量,那么代码将在执行i += 1时失败,不是吗? -
好吧
const i无法工作,因为i++试图修改它 -
@Bergi 但 OP 确实有道理。不是每个
i都绑定到新范围内的递增值吗? -
@ftor 是的,它会 - 如果它没有失败
TypeError: Assignment to constant variable -
@ftor 猜我得写一个答案
标签: javascript for-loop ecmascript-6 constants