JavaScript 递归函数在调用中包含 () 时中断

JavaScript recursive function breaks when () included in call

本文关键字:中断 包含 递归函数 调用 JavaScript      更新时间:2023-09-26

我使用 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);",因为我认为通常应该调用函数。 我对此感到非常困惑,如果有人愿意提供解释,我将不胜感激。

问:如果在"倒计时"一词后添加"()",为什么程序会中断?

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

这是一个语法问题。在javascript中,你不会在函数的括号中传递,只传递函数的名称。请参阅此帖子。