JavaScript递归函数在调用中包含“()”时出错

4
我使用 JavaScript 和 JQuery 创建了一个倒计时“番茄工作法”定时器。下面是相关的代码片段:

var time = 1500;
var cycle = "long";
var tracker = 0;
var paused = false;

//Timer countdown function
function countdown(){
    if (!paused) {

        var seconds = ("00" + (time % 60)).slice(-2);

        $("#time").text(Math.floor(time/60) + ":" + seconds);
        $("title").text(Math.floor(time/60) + ":" + seconds);

        if (time > 0){
        time--;
        setTimeout(countdown, 1000);
        //Once the time is up, determine cycle, play chime and reset timer.
        } else {
            document.getElementById("bell").play();
            tracker++;

            if (tracker == 7) {
                cycle = "long";
                time = 1500;
                setTimeout(countdown, 1000);
            } else if (tracker == 8) {
                time = 1500;
                setTimeout(countdown, 1000);
                tracker = 0;
            } else if (cycle == "short" && tracker < 7) {
                cycle = "long";
                time = 1500;
                setTimeout(countdown, 1000);
            } else if (cycle == "long" && tracker < 7) {
                cycle = "short";
                time = 300;
                setTimeout(countdown, 1000);
            }
        }  
    } else {
        setTimeout(countdown, 1);
    } 
}
setTimeout(countdown(), 1000);

在if语句的“else”部分中,函数调用“setTimeout(countdown, 1000);”会导致程序中断,如果按照以下方式编写:“setTimeout(countdown(), 1000);”,我认为应该正常调用函数。我对此完全感到困惑,非常希望有人能够提供解释。

问题: 如果在单词“countdown”后面添加“()”,为什么程序会中断?


1
setTimeout 接受一个函数作为参数。所以,我认为 setTimeout(countdown, 1000); 是正确的。 :) - Davin Tryon
就像@DavinTryon说的那样,它需要一个函数。 countdown() 是执行函数倒计时的语句。如果你想这么做,你需要将其包装在匿名函数中,即 function(){countdown()}。此外,尽管此问题的措辞如此,但显然是一个重复的问题。 - Rooster
你说的break是什么意思? - RobertoNovelo
2个回答

1
如果你写下 setTimeout(countdown(), 1000);,基本上当该代码块被评估时,JS会立即调用countdown()。通过 setTimeout(countdown, 1000); 进行操作,你正在将函数countdown的引用作为第一个参数传递,因此,它将在1秒后根据第二个参数(1000)执行。

谢谢,你的回答完美地解决了我的问题。 - Nick
没问题,很高兴能帮助你! - taxicala

0

这是一个语法问题。在 JavaScript 中,你不需要把函数的括号传进去,只需要传入函数的名称。请参见this post


你没有传递名称。你想要传递函数本身。 - Bergi

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