【发布时间】:2019-11-19 04:40:06
【问题描述】:
我有以下场景:
let func = () => {
//...
let id = setTimeout(() => {
console.trace();
clearTimeout(id);
func();
}, 2000);
}
func();
例如,如果我们在 Chrome 控制台中运行以下代码,我们会得到以下堆栈跟踪
console.trace
(anonymous) @ VM89644:4
setTimeout (async)
func @ VM89644:3
(anonymous) @ VM89644:6
setTimeout (async)
func @ VM89644:3
(anonymous) @ VM89644:6
setTimeout (async)
func @ VM89644:3
(anonymous) @ VM89644:6
setTimeout (async)
func @ VM89644:3
(anonymous) @ VM89644:6
setTimeout (async)
func @ VM89644:3
(anonymous) @ VM89644:6
setTimeout (async)
func @ VM89644:3
(anonymous) @ VM89644:6
...
...
...
在每次迭代中不断增加。最终它达到了一个最大值(我认为在 35 次迭代之后),链 似乎 停止增长,但我很好奇它是否只是 Chrome 没有显示它。到底发生了什么?
【问题讨论】:
-
我在上一个问题中没有正确传达我的担忧,当我尝试编辑它时它已经关闭。这就是为什么新问题的标题不同,侧重于闭包部分而不是堆栈框架部分,旨在以不同的方式为同一枚硬币的两面提供知识。
标签: javascript recursion memory-leaks settimeout