var 实现
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, i * 1000);
}
运行打印 5 个 5 。因为 funciton 里面的 log(i), i 都是指向全局作用域的 i, for 循环执行完了以后,i 已经变成 5 了。可以用下面办法变通:
for (var i = 0; i < 5; i++) {
(function () {
var j = i;
setTimeout(function() {
console.log(j);
}, i * 1000);
})();
}
再看下面的 let 实现:
for (let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, i * 1000);
}
打印 0 到 4。 原因是 let 是块级作用域,每次循环内部,都是一个新的 i (参考:[阮一峰的 es6]](http://es6.ruanyifeng.com/#docs/let) )。
这段代码可以看成这样的:(参考这里 )
{
let k;
for (k = 0; k < 5; k++) {
let i = k; // <-- new `i` for each iteration!
setTimeout(function() {
console.log(i);
}, i * 1000);
}
}