一尘不染

for循环中的let关键字

javascript

ECMAScript 6let应该提供块范围,而不会引起麻烦。有人可以解释为什么在i函数下面的代码中解析为循环中的最后一个值(与一样var),而不是当前迭代中的值吗?

"use strict";
var things = {};
for (let i = 0; i < 3; i++) {
    things["fun" + i] = function() {
        console.log(i);
    };
}

things["fun0"](); // prints 3
things["fun1"](); // prints 3
things["fun2"](); // prints 3

根据MDNlet在这样的for循环中使用应将变量绑定在循环主体的范围内。当我在块中使用临时变量时,事情按我期望的那样工作。为什么有必要?

"use strict";
var things = {};
for (let i = 0; i < 3; i++) {
    let index = i;
    things["fun" + i] = function() {
        console.log(index);
    };
}

things["fun0"](); // prints 0
things["fun1"](); // prints 1
things["fun2"](); // prints 2

我使用Traceur和来测试了脚本node --harmony


阅读 387

收藏
2020-05-01

共1个答案

一尘不染

quin着眼睛的答案不再是最新的。在ECMA 6规范中,指定的行为是

for(let i;;){}

i 在循环的每次迭代中获取一个新的绑定。

这意味着每个闭包都捕获一个不同的i实例。因此,截至目前的结果012是正确的结果。当您在Chrome v47
+中运行此程序时,您将获得正确的结果。在IE11和Edge中运行它时,当前333似乎会产生不正确的结果()。

2020-05-01