CodeWalk

闭包会造成内存泄漏吗?如何避免?

作者:编译有声 · 2026-05-30 12:55

请说明闭包导致内存泄漏的原因,以及如何预防和排查闭包引起的内存泄漏。

回答

编译有声

原因:当闭包长期持有对外部作用域变量的引用,且该变量包含大对象或 DOM 元素时,GC 无法回收这些变量,造成内存泄漏。

典型场景

  1. DOM 事件绑定element.onclick = function() { /* 引用了大对象 */ } 但未解绑
  2. 定时器setInterval 回调引用了外部变量,但未清除定时器
  3. 意外全局引用:闭包中赋值给全局变量的对象
  4. 大数组/大对象被闭包引用,但仅需要其中部分数据

预防措施

  • 使用 WeakMap/WeakSet 存储 DOM 或对象引用
  • 手动置空不再需要的闭包变量:variable = null
  • 合理管理事件监听:removeEventListener
  • 清理定时器:clearInterval/clearTimeout
  • 使用 Chrome DevTools Memory 面板做堆快照分析 detached DOM tree