阻止让我们和...的范围

时间:2015-12-16 16:36:38

标签: javascript firefox ecmascript-6

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循环内部有什么不同?

1 个答案:

答案 0 :(得分:2)

正如其他人在评论中指出的那样,这种破坏的行为似乎特定于Firefox,并且代码在其他环境中正常运行(例如V8 / Node)。

因此,我为它创建了一个bug report。当我从Firefox团队那里学到新东西时,我会更新这个答案。

这个bug已经在去年8月左右修复,并且已经落在中央代码库中。该修复程序现已包含在2017年1月24日最终发布的Firefox 51 release中。

我正在使用Firefox Nightly预览版本,它已经在那里正常工作了一段时间。