为什么用括号调用setTimeout不会启动新的callstack?

时间:2011-11-09 00:33:20

标签: javascript settimeout callstack

当调试器在d(jsfiddle here)中触发时,以下代码有一个新的callstack

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

function d() {
    debugger;   
}

c();

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

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

function d() {
    debugger;   
}

c();

然后callstack同时有c()和d()(jsfiddle here)。为什么呢?

3 个答案:

答案 0 :(得分:9)

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

调用d的结果是undefined,因为它不会返回任何内容,而是转换为字符串"undefined",然后eval编辑,正在执行...


关于callstacks,因为你在d内调用c,这就是你在callstack中看到c的原因。为了澄清,您的第二个示例与

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

function d() {
    debugger;   
}

c();

答案 1 :(得分:2)

SetTimeout采用函数参数。如果传递一个字符串,它就像eval一样。如果你像调用函数那样调用函数,它会立即触发,然后setTimeout触发,并在新的调用堆栈中触发结果。

答案 2 :(得分:1)

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