当调试器在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)。为什么呢?
答案 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秒内调用。