通过使用javascript递归setTimeout函数,获取堆栈溢出是否有风险?
通过尝试此示例,您可以在浏览器控制台中看到堆栈增长。为什么会这样?
var iteration = 0;
function bar() {
iteration++;
console.log("iteration: " + iteration);
console.trace();
if(iteration < 5){
setTimeout(bar, 5000);
}
}
bar();
&#13;
答案 0 :(得分:5)
通过使用javascript递归setTimeout函数,获取堆栈溢出是否有风险?
没有。 setTimeout
注册一个处理程序,当计时器触发时,该处理程序将被浏览器调用。到发生这种情况时,堆栈已经解开(如果没有,则计划超时的任务不会结束,并且浏览器的UI将被锁定等待它结束)。
通过尝试此示例,您可以在浏览器控制台中看到堆栈增长。
不,在下一次调用处理程序之前,堆栈会展开。如果您指的是Chrome的devtools向您展示的异步“堆栈”条目,那些不是真正的堆栈,它们是devtools工件。 (启动计时器,注意两个刻度,以便在第二个上看到“异步”条目,然后关闭控制台,再等两个刻度,然后重新打开它;注意没有任何“异步”条目 - 根本没有,在关闭控制台之前,甚至没有看到它的那个!)