【发布时间】:2016-06-29 16:56:02
【问题描述】:
下面的代码,如果你在Chrome和Firefox中执行它会返回不同的行为。
var obj = {
key: 'val',
key2: 'val'
};
function x(b) {
setTimeout(b, 1000);
}
var keys = Object.keys(obj);
for (let ki of keys) {
x(function() {
console.log(ki); // Prints key2 key2 in Firefox, key key2 in Chrome
});
}
为什么会这样?这是一个错误? Chrome返回的正确输出应该是计算规格吗?
【问题讨论】:
-
Firefox 的实现尚未完成。 kangax.github.io/compat-table/es6/#test-let 同时,在循环内创建一个本地
let变量并使用它。let kki = ki; -
它在 Firefox 中看起来像是一个不完整的实现。对于循环的每次迭代,应该有一个完全唯一的变量
ki,而 Firefox 还没有这样做。它为所有迭代共享相同的变量。 -
谢谢你们! =)
-
不客气。请注意,为该
let创建了一个范围,但该范围基本上包含了整个for-of语句。所以就像{let ki; for (ki of keys) {...} }Firefox 在规范之前有let,而规范最终没有匹配它们的实现。
标签: javascript function loops scope