使用JavaScript递归setTimeout函数,是否存在堆栈溢出的风险?

8

使用JavaScript递归setTimeout函数,是否有获取stackoverflow的风险?

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

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

bar();


3
通过尝试这个例子,你可以在浏览器控制台中看到堆栈增长的情况。您的想法是什么? - T.J. Crowder
你是否在一个setTimeout被替换为同步版本的环境中运行? - Touffy
1个回答

12
使用JavaScript递归的setTimeout函数,是否有获取stackoverflow(sta溢出)的风险?
不会。setTimeout注册了一个处理程序,在定时器触发时会被浏览器调用。在此之前,栈已经解开(如果没有解开,安排超时的任务将无法结束,浏览器的UI将被锁定等待它结束)。
通过尝试该示例,您可以在浏览器控制台中看到堆栈增长。
不会,处理程序下一次被调用之前,堆栈就已经解除了。 如果您正在指Chrome devtools显示给您的异步“stack”条目,则这些不是真正的堆栈,它们是devtools的一个产物(启动计时器,观察两个滴答声以便您看到第二个上的“async”条目,然后关闭控制台,等待两个更多的滴答声,重新打开它;注意,没有任何“async”条目——完全没有,甚至不是您在关闭控制台之前看到的那个!)。

3
如果问题是“我看到的这些(异步)堆栈条目是什么”,那么它就不会是一个重复的问题,但实际上被问到的问题确实是一个重复的问题... :-) - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接