通过使用javascript递归setTimeout函数,获取堆栈溢出是否有风险?

时间:2018-02-11 20:50:36

标签: javascript recursion settimeout stack-overflow

通过使用javascript递归setTimeout函数,获取堆栈溢出是否有风险?

通过尝试此示例,您可以在浏览器控制台中看到堆栈增长。为什么会这样?



var iteration = 0;
  function bar() {
    iteration++;
    console.log("iteration: " + iteration);
    console.trace();
    if(iteration < 5){
    	setTimeout(bar, 5000);
    } 
  }

bar();
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:5)

  

通过使用javascript递归setTimeout函数,获取堆栈溢出是否有风险?

没有。 setTimeout注册一个处理程序,当计时器触发时,该处理程序将被浏览器调用。到发生这种情况时,堆栈已经解开(如果没有,则计划超时的任务不会结束,并且浏览器的UI将被锁定等待它结束)。

  

通过尝试此示例,您可以在浏览器控制台中看到堆栈增长。

不,在下一次调用处理程序之前,堆栈会展开。如果您指的是Chrome的devtools向您展示的异步“堆栈”条目,那些不是真正的堆栈,它们是devtools工件。 (启动计时器,注意两个刻度,以便在第二个上看到“异步”条目,然后关闭控制台,再等两个刻度,然后重新打开它;注意没有任何“异步”条目 - 根本没有,在关闭控制台之前,甚至没有看到它的那个!)