【问题标题】:JS setTimeout Not DelayingJS setTimeout 不延迟
【发布时间】:2011-07-13 23:22:48
【问题描述】:

好的,我正在尝试每 1/4 秒左右在我的页面上添加数字。因此,用户可以看到更改。我正在使用 setTimeout 并且我的所有计算都正确进行,但没有任何延迟。代码如下:

for(var i = 0; i < 10; i++)
{
  setTimeout(addNum(i),250);
}

我也尝试过捕获返回值:

for(var i = 0; i < 10; i++)
{
  var t = setTimeout(addNum(i),250);
}

我也尝试使用函数语法作为 setTimeout 参数的一部分:

for(var i = 0; i < 10; i++)
{
  var t = setTimeout(function(){array[j].innerHTML + 1},250);
}

我还尝试将代码放入字符串中,并将函数调用放入字符串中。我永远不能拖延。请帮忙!

【问题讨论】:

    标签: javascript delay settimeout


    【解决方案1】:

    怎么样:

    var i=0;
    function adder() {
       if(i>=10) {return;}
       addNum(i++);
       setTimeout(adder,250);
    }
    adder();
    

    当您执行setTimeout(addNum(i),250); 时,您立即执行了函数(函数名称后跟() 将立即执行它并将返回值 传递给超时执行1/4 秒之后)。因此,在一个只会立即执行所有 10 个的循环中。就是你看到的。

    捕获返回值var t = setTimeout(...); 很有帮助,但在您的用例中没有用;该值为定时器id号,用于取消超时。

    不确定您的最后一次尝试是什么,尽管它可能是您的 addNum 例程的函数体,因此与上述相同的逻辑适用。

    【讨论】:

    • Teeeeecccchhhhnniicallly,这应该是一个闭包以避免全局 i,但 +1 用于解决实际问题并提供工作代码。
    • 所以...这会执行多次??这就是为什么我使用循环 bc 我需要它在多个地方多次添加。
    • @Ray,我认为它将在实际实现中处于闭包中(我无意复制整个命名空间以匹配真实的代码库,这不是我的做法)。此外,我认为了解污染全局名称空间含义的人将能够适当地实施解决方案,而对于那些不了解的人来说,无需为简单的任务添加额外的混乱。这里的工作不是列举你知道的每一个好的实践,而是解决手头的问题。但欢迎您以任何您认为的方式回答问题,这是我的 2c。
    • @Exception,它将执行addNum(i),其值为i,从09,每1/4 秒执行一次。虽然我建议你自己测试一下。更改数字,看看它是如何响应的。尝试并了解它为什么会这样工作。
    • 会的。而且我认为@Ray 是一位学者(从他的电子邮件地址来看),这可以解释为什么他对使用全局变量如此敏感。哈哈
    【解决方案2】:

    也许相反,由于您多次运行相同的方法,您应该改用setInterval 方法吗? Here's an example of how you might do that.

    【讨论】:

    • 我想我应该根据您提供的链接使用setInterval。但我也遇到了麻烦。如果我只是通过setInterval 一个方法,它只是将一个值加到一个值上。当页面加载时,它只执行一次。 function add(){var i = i++;} setInterval(add(),500);
    • 因为您正在调用该方法,而不是传递对它的引用,对于 setInterval - 只需删除括号来修复它:function add(){var i = i++;} setInterval(add, 500);
    【解决方案3】:

    试试 setTimeout("addNum(" + i + ")", 250);它不起作用的原因是因为它评估参数并执行它并将其更改为 setTimeout(result of addNum(i), 250);

    【讨论】:

    • 这不会按照他想要的方式分隔数字,因为setTimeout 会立即返回。
    • 如果将参数作为字符串括起来,它会在 setTimeout 内进行评估,以便正确执行
    • 但是是的,所有 10 个都会在循环中同时发生,setInterval 可能是一个更好的选择
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 2012-09-19
    • 2016-11-15
    • 2016-12-19
    相关资源
    最近更新 更多