【问题标题】:Recursive setInterval() runs continuously递归 setInterval() 连续运行
【发布时间】:2013-09-08 19:32:18
【问题描述】:

我正在尝试使用 JavaScript 使用递归 setInterval 函数每 5 秒运行一次函数。

以下代码尽可能快地记录“已启动”,然后使浏览器崩溃。为什么不是每 5 秒运行一次?

function five() {
console.log("five");
setInterval(five(), 5000);
}
five();

【问题讨论】:

  • Tommy 务必将 Joseph 的回答标记为已接受!
  • setInterval != setTimeout
  • 杰夫曼的评论是我打算接受的,有错吗?
  • 我认为setInterval 是更适合在您的上下文中使用的函数。
  • setInterval 很好,但只调用一次,而不是每次函数迭代。这就是约瑟夫的答案比其他一些人更好的原因(直到他们被修改)。

标签: javascript recursion setinterval


【解决方案1】:

不要以这种方式使用 setInterval。使用设置超时。通过调用 setInterval,您可以在每次调用该函数时创建一个 UNIQUE 计时器。 SetTimeout 将创建一个结束的计时器,然后创建一个新的计时器。

您还应该更改引用five 的方式。 five() 立即执行该函数。只需 five 传递一个函数引用,如下所示。

function five() {
    console.log("five");
    setTimeout(five, 5000);
}
five();

当然,您始终可以将函数调用作为要评估的字符串传递:

    setTimeout("five()", 5000); // note the quotes

但这通常被认为是不好的做法。

【讨论】:

  • 有趣的是,我刚刚注意到这一点,setTimeout 现在以正确的方式为我工作。
  • 如果您可以添加解释以使用五而不是五()我会接受这个
【解决方案2】:

立即致电five,而不是仅仅将其传递

function five () {
    console.log("five");
}
setInterval(five, 5000);
/*              ^     */

【讨论】:

  • 太棒了!谢谢!简单而高效! :)
【解决方案3】:

改变这一行:

setInterval(five(), 5000);

像这样:

setInterval(five, 5000);

但看起来你真正需要的是:

setTimeout(five, 5000);

所以您的代码将如下所示:

function five() {
   console.log("five");
   setTimeout(five, 5000);
}
five();

【讨论】:

    【解决方案4】:

    崩溃的原因是你调用了函数5。相反,您应该将其作为参数传递。

    setInterval(five, 5000);
    

    【讨论】:

    • 我在 google 表单的 javascript 中使用了 setInterval,但它不起作用。任何线索@Krasimir?
    • 好吧,你必须发布一些代码。不知道你具体是怎么用setInterval的。
    猜你喜欢
    • 2017-07-29
    • 2021-03-01
    • 2021-09-29
    • 1970-01-01
    • 2023-03-27
    • 2021-04-23
    • 2019-12-07
    • 1970-01-01
    相关资源
    最近更新 更多