【问题标题】:Using setTimeout and an integer in a for loop在 for 循环中使用 setTimeout 和整数
【发布时间】:2012-12-05 20:25:39
【问题描述】:

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

有什么问题?

【问题讨论】:

    标签: javascript jquery for-loop


    【解决方案1】:

    使用这个:

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

    您的问题是 i 发生了变化,而您总是使用 i 的最后一个值进行调用,因为您传递给 setTimeout 的回调是在循环结束后调用的。

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

    【讨论】:

    • 有效!我已经尝试了一个多小时。我现在明白了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 2019-08-21
    • 2011-05-02
    相关资源
    最近更新 更多