这个javascript代码会创建一个大堆栈吗?

时间:2014-07-03 18:08:29

标签: javascript jquery recursion stack stack-overflow

function startAJAXcalls()
{
   setTimeout(function(){
      getXMLData();
      startAJAXcalls();
       },
       10000
   );
}

startAJAXcalls();

我从Head First JQuery书中提取了这段代码。它说这将保证不存在请求的累积,我同意这是真的,但我担心不允许退出的大量函数调用。由于通过setTimeout()异步调用startAJAXcalls(),是否每次调用startAJAXcalls()都在自己的堆栈中?

1 个答案:

答案 0 :(得分:3)

不,因为一旦你调用setTimeout,该函数将退出,然后对startAJAXcalls的下一次调用将以新的堆栈帧开始,因为setTimeout只是将回调函数排入队列Javascript引擎保留的内容列表,直到它们应该被执行。可以想象有一个静态的函数列表,每次调用setTimeout时,它都会将函数添加到该列表中。稍后在Javascript引擎的某个时刻执行该回调,它只是将另一个回调放入同一个列表中,并且Javacript引擎在时机成熟时保持循环清空并从列表中调用回调。

关于Javascript如何在此处实现计时器的非常好的信息:http://ejohn.org/blog/how-javascript-timers-work/