为什么调用带有括号的setTimeout不会启动一个新的调用栈

Why does calling setTimeout with parenthesis not start a new callstack?

本文关键字:调用 一个 启动 为什么 setTimeout      更新时间:2023-09-26

当调试器在d(此处为jsfiddle)中启动时,以下代码有一个新的调用堆栈

function c() {
    setTimeout( d, 1000 );
}
function d() {
    debugger;   
}
c();

如果我们将代码修改为使用带有括号(括号:)的setTimeout( d(), 1000 );

function c() {
    setTimeout( d(), 1000 );
}
function d() {
    debugger;   
}
c();

则调用堆栈同时具有c()和d()(此处为jsend)。为什么?

您没有将第二个示例中的d函数传递给setTimeout;您正在传递d(),这是调用d的结果。

调用d的结果是undefined,因为它没有返回任何东西,它转换为字符串"undefined",然后是eval ed,做…正是。


关于调用堆栈,因为你在c内部调用d,这就是为什么你在调用堆栈中看到c。为了澄清,第二个示例与

相同
function c() {
    var temp = d();
    setTimeout(temp, 1000);
}
function d() {
    debugger;   
}
c();

SetTimeout接受一个函数参数。如果你传递一个字符串,它的行为就像eval。如果您像之前那样调用该函数,它会立即触发,然后setTimeout会在新的调用堆栈中触发结果。

因为在第一个例子中,你传递了一个函数指针作为在1秒内执行的东西。在第二个示例中,您已经执行了d,并且将d()的结果传递给setTimeout,以便在1秒内调用。