为什么 setTimeout 需要匿名函数才能工作?

Cha*_*les 1 javascript setinterval

我读StackOverflow上的答案在这里解释了如何使用的setTimeout来创造一种在网页上反复循环。但是,我想知道为什么 setTimeout 需要匿名函数才能工作。考虑以下代码:

trainingTimer(60,0);

function trainingTimer(duration,c) {
    document.getElementById("timer").innerHTML = "Time left: "+(duration-c);
    if(duration==c) {
        alert("Time is up!");
    }
    else {
        window.setTimeout(trainingTimer(duration,c+1),1000);
    }
}
Run Code Online (Sandbox Code Playgroud)

我是根据上面链接的答案写的,但是当它运行时,它会trainingTimer一次遍历所有 60 个调用,并立即在我的网页上显示“剩余时间:0”。但是,如果我修改

window.setTimeout(trainingTimer(duration,c+1),1000);

trainingTimer(duration,c+1)像这样包装一个匿名函数

window.setTimeout(function() {trainingTimer(duration,c+1)},1000);

那么代码工作得很好。

我想知道为什么我必须将命名函数包装在匿名函数中才能使 setInterval 正常工作。感谢所有的帮助。

epa*_*llo 5

这个

window.setTimeout(trainingTimer(duration,c+1),1000); 
Run Code Online (Sandbox Code Playgroud)

是相同的

var result = trainingTimer(duration,c+1);
window.setTimeout(result,1000); 
Run Code Online (Sandbox Code Playgroud)

它获取执行方法的结果并分配它。

而且由于训练计时器方法不返回任何内容。你的代码基本上是这样的

trainingTimer(duration,c+1);
window.setTimeout(undefined, 1000); 
Run Code Online (Sandbox Code Playgroud)