javascript – 阻止let和for …的范围

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

为什么不让这里工作的行为,以及内部因为这个断开的循环有什么不同?

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

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

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

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

点赞