for 循环中的 let

2016-12-04  本文已影响116人  saronic

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);
    }

}
上一篇 下一篇

猜你喜欢

热点阅读