设置超时

时间:2015-04-22 11:09:55

标签: javascript closures

我在教程中找到了一些例子(说这是规范的例子)

        for (var i=1; i<=5 ; i++) {
        setTimeout(function() {
            console.log("i: " + i);
        }, i*1000);
    }

现在,我理解,闭包在当前作用域中传递给函数,我假设它应该输出1,2,3,4,5。但相反,它打印数字6五次。
我在chrome调试器中运行它,首先它在没有进入函数的情况下进行循环,同时执行i值的增量,然后只进行内部函数并执行5次。
我不知道为什么它这样做,我知道,由于闭包,当前的作用域被传递给函数,但为什么每次循环迭代都不执行它?

2 个答案:

答案 0 :(得分:4)

超时运行时,for循环已完成,i为6,这就是您获得输出的原因。您需要在循环期间捕获i

for (var i=1; i<=5 ; i++) {
    (function(innerI) {
        setTimeout(function() {
            console.log("i: " + innerI);
        }, innerI*1000);
    })(i);
}

这会创建一个带有自己的参数(innerI)的内部函数,该参数会立即被调用,因此会捕获i的值以便在超时时间内使用。

答案 1 :(得分:0)

谢谢你的帮助, 我找到了另一个解决方案,这是一个小小的改变。

在页面顶部,我打开了严格模式,也在for循环中,而不是var,我使用了“let”关键字。