为什么setTimeout调用的函数没有callstack限制?

SKi*_*ng7 4 javascript browser settimeout

timer =  window.setTimeout(function () {
    //do something
    window.setTimeout(arguments.callee, 1000);
}, 1000);
Run Code Online (Sandbox Code Playgroud)

结果是这些代码运作良好.

但为什么导致下面的错误?

超出最大调用堆栈大小

在调试它时,找到变量范围不包括先前执行的"setTimeout函数"的范围

谁能解释一下?

最好是文档.

Ber*_*rgi 7

setTimeout是异步的(它在执行回调之前返回),并且回调将在新的空堆栈帧上执行.这就是整个目的.

它不是递归调用,需要保留范围(在非尾调用优化函数的情况下).但这也意味着该功能变得阻塞,这不是你想要的.

  • @SKing7 有 DOM 计时器 API 指定它应该如何工作,我可以向您发送一个 chrome 中实现的链接 - 但这并没有太大帮助。http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html 这里是计时器 API。 (2认同)