递归的setInterval()函数会持续运行

7
我正在尝试使用JavaScript中的递归setInterval函数每5秒运行一次函数。
以下代码尝试尽可能快地记录"started",然后导致浏览器崩溃。为什么它没有按照预期每5秒运行一次呢?
function five() {
console.log("five");
setInterval(five(), 5000);
}
five();

Tommy,请务必将Joseph的答案标记为已接受! - dcaswell
setInterval != setTimeout - ZippyV
Jeffman的评论是我计划接受的,这样做有问题吗? - Tommy Nicholas
1
жҲ‘и®ӨдёәsetIntervalеҮҪж•°еңЁдҪ зҡ„жғ…еўғдёӯжӣҙеҠ еҗҲйҖӮгҖӮ - Joseph Silber
2
setInterval可以使用,但只需调用一次,而不是每次函数迭代时都调用。这就是为什么Joseph的答案比其他一些答案更好(直到它们被修订)。 - user2625787
4个回答

17
不要使用 setInterval 的方式,而是使用 setTimeout。通过调用 setInterval,每次调用函数时都会创建一个唯一的定时器。SetTimeout 会创建一个定时器,然后结束,再创建一个新的定时器。
您还应该更改对 five 的引用方式。five() 立即执行函数。只有 five 传递了一个函数引用,所以请按照下面所示进行操作。
function five() {
    console.log("five");
    setTimeout(five, 5000);
}
five();

当然,您始终可以将函数调用作为要评估的字符串传递:
    setTimeout("five()", 5000); // note the quotes

但这通常被认为是不良的实践。


有趣的是,我刚刚注意到了这一点,setTimeout现在以正确的方式为我工作。 - Tommy Nicholas
如果您能添加一个解释,说明为什么要使用“五”而不是“五()”,我会接受这个。 - Tommy Nicholas

8
你正在立即调用`五`,而不仅仅是将其传递进去:
function five () {
    console.log("five");
}
setInterval(five, 5000);
/*              ^     */

太棒了!谢谢!简单而有效! :) - Emanuela Colta

3

请将这一行改为:

setInterval(five(), 5000);

像这样:

setInterval(five, 5000);

但是看起来你真正需要的是:
setTimeout(five, 5000);

那么您的代码将如下所示:

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

0
导致崩溃的原因是您正在调用函数five。您应该将其作为参数传递而不是直接调用。
setInterval(five, 5000);

我在 Google 表单的 JavaScript 中使用了 setInterval,但它不起作用。@Krasimir 有什么线索吗? - gumuruh
好的,你需要发布一些代码。我不知道你如何准确地使用 setInterval - Krasimir
请问如何使用Google表单进行倒计时循环? - gumuruh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接