【发布时间】:2013-05-10 00:31:03
【问题描述】:
ECMAScript 6 的let 应该提供块范围而不会让人头疼。有人能解释一下为什么在i 下面的代码中,函数解析为循环中的最后一个值(就像var)而不是当前迭代中的值?
"use strict";
var things = {};
for (let i = 0; i < 3; i++) {
things["fun" + i] = function() {
console.log(i);
};
}
things["fun0"](); // prints 3
things["fun1"](); // prints 3
things["fun2"](); // prints 3
根据MDN 在for 循环中使用let,应该将变量绑定在循环体的范围内。当我在块内使用临时变量时,事情就像我期望的那样工作。为什么有必要?
"use strict";
var things = {};
for (let i = 0; i < 3; i++) {
let index = i;
things["fun" + i] = function() {
console.log(index);
};
}
things["fun0"](); // prints 0
things["fun1"](); // prints 1
things["fun2"](); // prints 2
我使用 Traceur 和 node --harmony 测试了脚本。
【问题讨论】:
-
TL;DR:第一个代码 sn-p 演示了环境的 JavaScript 实现中的一个错误。也就是说,正确的行为是输出 0、1 和 2,而不是 3、3 和 3。现代浏览器正常工作,运行代码时输出 0、1 和 2。
-
显然这里有三种不同的作用域:
let x = 5; for (let x = 0; x < 10; x++) { let x = 3; console.log(x); }