Javascript 在for循环中使用setTimeout和整数

Javascript 在for循环中使用setTimeout和整数,javascript,jquery,for-loop,Javascript,Jquery,For Loop,我有一个id为“播放”的按钮 我要用这个密码倒计时。但由于某种原因,我不能让它工作 var timeoutTime = 500, seconds = 5; var countdown = $("#play h4"); for(var i = seconds; i>0; i--) { setTimeout(function() { countdown.text("" + i); },timeoutTime); timeoutTime += 1000; } 我尝试了很

我有一个id为“播放”的按钮

我要用这个密码倒计时。但由于某种原因,我不能让它工作

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,而不是54 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)具有所需的值。它之所以有效,是因为对于每个迭代,这是一个不同的函数(变量的作用域是全局作用域或声明它的函数)。

使用以下方法:

for(var i = seconds; i>0; i--) {
    (function(i){
      setTimeout(function() {
          countdown.text("" + i); }, timeoutTime);
    })(i);
    timeoutTime += 1000;
}
你的问题是我改变了,你总是用最后一个值i调用,因为你传递给setTimeout的回调是在循环完成后调用的


经典的解决方案是使用闭包来保持另一个变量(这里使用相同的名称i)具有所需的值。它之所以有效,是因为对于每个迭代,这是一个不同的函数(变量的作用域要么是全局作用域,要么是声明它的函数)。

它有效!我已经试了一个多小时了。我现在明白了。谢谢它起作用了!我已经试了一个多小时了。我现在明白了。谢谢