闭包会造成内存泄漏吗?如何避免?
请说明闭包导致内存泄漏的原因,以及如何预防和排查闭包引起的内存泄漏。
回答
编译有声
原因:当闭包长期持有对外部作用域变量的引用,且该变量包含大对象或 DOM 元素时,GC 无法回收这些变量,造成内存泄漏。
典型场景:
- DOM 事件绑定:
element.onclick = function() { /* 引用了大对象 */ }但未解绑 - 定时器:
setInterval回调引用了外部变量,但未清除定时器 - 意外全局引用:闭包中赋值给全局变量的对象
- 大数组/大对象被闭包引用,但仅需要其中部分数据
预防措施:
- 使用
WeakMap/WeakSet存储 DOM 或对象引用 - 手动置空不再需要的闭包变量:
variable = null - 合理管理事件监听:
removeEventListener - 清理定时器:
clearInterval/clearTimeout - 使用 Chrome DevTools Memory 面板做堆快照分析 detached DOM tree