let 和 for…of 的代码块作用域

4
ES2015 中的 let 语句允许我们声明块级作用域变量,因此例如下面的代码会按照我们的预期工作:
let fs = [];
for (let i = 0; i < 3; i++) {
    fs.push(() => i);
}
console.log(fs.map(f => f())); // 0, 1, 2

然而,使用迭代对象的 for…of 循环在 Firefox 中似乎不起作用。在这里,块级作用域被忽略,我们得到与使用 var 相同的结果:
fs = [];
let nums = [0, 1, 2];
for (let i of nums) {
    fs.push(() => i);
}
console.log(fs.map(f => f())); // 2, 2, 2

为什么这里let的行为不起作用,而for...of循环在内部有何不同,导致此处出现问题?


3
你使用的是哪个环境?对我来说似乎是一个错误。 - Felix Kling
使用 Babel 的 REPL,两者都可以得出 0,1,2。https://babeljs.io/repl/ - chiliNUT
哦,那显然是Firefox的一个bug。 - poke
在Node.js 4.2.1中似乎也能正常工作。 - jishi
1个回答

2
正如其他评论中所指出的那样,这种错误行为似乎是特定于Firefox的,而在其他环境中(例如V8 / Node),代码正常工作。

因此,我已经为此创建了一个错误报告。 我会在从Firefox团队获得新信息时更新这个答案。


这个 bug 已经在去年 8 月左右修复了,并已经加入到中央代码库中。现在这个修复已经包含在 Firefox 51 发布版 中,该版本已于 2017 年 1 月 24 日最终发布。
我正在使用 Firefox Nightly 预览版本,它在那里运行良好已经一段时间了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接