为什么功能输出总是5?

时间:2015-09-21 22:10:27

标签: javascript for-loop settimeout

有谁知道为什么这段代码的输出是5倍?

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

for语句永远不会到达5:S

3 个答案:

答案 0 :(得分:3)

您需要创建一个闭包以保留i变量的值。否则,i变量将是setTimeout执行时的最后一次迭代的值

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

请阅读有关IIFEs

的内容

答案 1 :(得分:1)

只需修改一下你的代码,就可以了:

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

setTimeout

答案 2 :(得分:0)

关闭的经典例子:

  

闭包是指独立(自由)变量的函数。在   换句话说,封闭中定义的函数会记住&#39;该   它创建的环境。

您的内部函数可以访问环境(在此示例中使用外部变量 i )。循环结束后, i 的值为5,您的函数使用此值。当然,如果你在循环结束后使用 console.log(i)

试试这篇文章 - Closure - MDN