ES2015中的let
语句允许我们声明块范围变量,以便例如以下代码执行我们想要的操作:
let fs = [];
for (let i = 0; i < 3; i++) {
fs.push(() => i);
}
console.log(fs.map(f => f())); // 0, 1, 2
然而,它似乎在Firefox 中,for…of
loop迭代可迭代对象。这里,块范围被忽略,我们得到的结果与使用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
循环内部有什么不同?
答案 0 :(得分:2)
正如其他人在评论中指出的那样,这种破坏的行为似乎特定于Firefox,并且代码在其他环境中正常运行(例如V8 / Node)。
因此,我为它创建了一个bug report。当我从Firefox团队那里学到新东西时,我会更新这个答案。
这个bug已经在去年8月左右修复,并且已经落在中央代码库中。该修复程序现已包含在2017年1月24日最终发布的Firefox 51 release中。
我正在使用Firefox Nightly预览版本,它已经在那里正常工作了一段时间。