【发布时间】:2011-12-24 22:21:27
【问题描述】:
当调试器在 d (jsfiddle here) 中触发时,以下代码有一个新的调用堆栈
function c() {
setTimeout( d, 1000 );
}
function d() {
debugger;
}
c();
如果我们修改代码以使用带有括号(括号:)的setTimeout( d(), 1000 );
function c() {
setTimeout( d(), 1000 );
}
function d() {
debugger;
}
c();
然后调用堆栈同时具有 c() 和 d() (jsfiddle here)。为什么?
【问题讨论】:
-
d计算为函数对象。在函数对象上使用函数应用运算符()(由d的评估产生)立即调用它并评估所述函数的结果(在这种情况下未定义),然后将其传递为setTimeout的参数。也就是说,它等价于:var r = d(); setTimeout(r, 1000);,或者在本例中为d(); setTimeout(undefined, 1000)。 -
-
@Aran:这是完全相同的问题,尽管表述方式不同。立即函数调用与将帧推入调用堆栈而另一个仍处于活动状态的帧相同。调用堆栈的提及仅根据特定的计算模型提出问题。如果有的话,这是对问题的更有限的陈述。
-
@outis 我仍然认为这是一个有效的问题,并且以不止一种方式提出问题只会扩大对问题空间的更好理解的可能性。我一直在寻找一种方法来启动一个新的调用堆栈,我最终更好地理解了 setTimeout。一旦你知道答案,你就可以把它看作是重复的,在此之前它是完全不同的,并且与不同的问题有关。
标签: javascript settimeout callstack