自调度函数的词法环境与内存:该JS代码是否存在内存泄漏?
这段JS代码是否存在内存泄漏?
结论:不存在内存泄漏
你的推理错误点:
- 你对词法环境链的理解存在偏差。每次调用
foo()时,确实会创建新的词法环境,但foo()执行完成后,只有内部箭头函数引用的str变量会被保留,当前foo词法环境的其他内容已经没有引用。 - 箭头函数仅被
setImmediate的回调队列持有,当该回调执行完毕后,旧的str和对应的词法环境就会失去所有引用,被垃圾回收器正常回收。不会形成持续增长的词法环境链——每个foo调用的词法环境只被自身生成的箭头函数引用,回调执行后旧引用链就会断裂,不会堆积。
优化写法(非必须,仅为更清晰的逻辑)
如果想避免依赖闭包传递变量,可采用显式传参的模式,逻辑更直观:
let n = 0; function logStr(str) { console.log('str=' + str); const newStr = '...long string' + (++n); setImmediate(logStr, newStr); } logStr('...long string' + (++n));
内容的提问来源于stack exchange,提问作者Yevgeniy P
相关产品推荐
相关产品推荐

