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

我有一个带有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。

有什么问题 ?

用这个 :

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

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

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