在for循环中使用setTimeout和一个整数

时间:2012-12-05 20:25:39

标签: javascript jquery for-loop

我有一个ID为play的按钮。

我希望使用此代码对该按钮进行倒计时。但由于某种原因,我不能让这个工作。

var timeoutTime = 500, seconds = 5;
var countdown = $("#play h4");
for(var i = seconds; i>0; i--)
{
    setTimeout(function() {
    countdown.text("" + i); },timeoutTime);
    timeoutTime += 1000;
}

我尝试了很多东西,我能得到的最好的只是1而不是5 4 3 2 1.使用这段代码,我在按钮上得到0。

有什么问题?

1 个答案:

答案 0 :(得分:4)

使用此:

for(var i = seconds; i>0; i--) {
    (function(i){
      setTimeout(function() {
          countdown.text("" + i); }, timeoutTime);
    })(i);
    timeoutTime += 1000;
}

你的问题是我改变了你总是用i的最后一个值调用,因为你传递给setTimeout的回调是在循环结束后调用的。

经典的解决方案是使用闭包来保持另一个具有所需值的变量(此处具有相同的名称i)。它起作用,因为这是每次迭代的不同函数(变量的范围是全局范围或声明它的函数)。