调用setTimeout是否清除了callstack?

Ara*_*and 12 javascript callstack settimeout

通过使用setTimeout方法调用函数而不是直接调用函数,可以在javascript中避免堆栈溢出吗?我对setTimeout的理解是它应该启动一个新的callstack.当我查看chrome和IE的callstack时,似乎setTimeout调用正在等待函数调用返回.

这只是调试器的属性还是我的理解有缺陷?

编辑

虽然下面提供的答案是正确的,但我遇到的实际问题与我调用setTimeout(aFunction(),10)的事实有关,因为括号因此立即评估aFunction.这个问题把我排除在外.

Šim*_*das 17

我可以确认堆栈已清除.

考虑这种情况:

function a() {
     b();   
}

function b() {
     c();   
}

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

function d() {
    debugger;
}

a();
Run Code Online (Sandbox Code Playgroud)

所以有两个断点 - 一个在函数的开头c,一个在函数的开头d.

在第一个断点处堆叠:

  • C()
  • B()
  • 一个()

在第二个断点处堆叠:

  • d()

现场演示: http ://jsfiddle.net/nbf4n/1/


Dom*_*nic 5

异步调用(例如来自的调用)setTimeout的确会生成新的调用栈。

当您说“当我查看chrome和IE的调用栈时,似乎setTimeout调用正在等待函数调用返回时,您所描述的内容还不清楚。” 但是,您可以做的一件事是将一个断点放在by setTimeout调用的函数中,并查看该调用栈为空。