JavaScript垃圾回收通过标记-清除算法自动释放无用对象,优化需及时断开无效引用。1. 解除事件监听与定时器避免残留回调;2. 闭包中避免长期持有大对象,使用后置NULL;3. 移除dom后清除引用,缓存用Weakmap/WeakSet防泄漏;4. WeakMap键对象可被回收,适合元数据存储。核心是切断可达路径,防止内存泄漏。

JavaScript 垃圾回收(Garbage Collection, GC)是自动管理内存的机制,主要通过标记-清除(Mark-and-Sweep)算法识别并释放不再使用的对象。虽然开发者不需要手动清理内存,但不当的代码模式会导致内存泄漏或频繁 GC,影响性能。优化关键在于减少无效引用、控制对象生命周期和避免常见陷阱。
1. 及时解除事件监听和定时器
DOM 事件监听和定时器是常见的内存泄漏源头。即使目标元素被移除,若未显式解绑,回调函数仍会被保留,导致其作用域内的变量无法释放。
- 使用 addEventListener 后,应在适当时机调用 removeEventListener
 - 定时器(setInterval 或 setTimeout)在组件销毁或任务完成后应调用 clearInterval 或 clearTimeout
 - 考虑使用 AbortController 管理多个监听器,便于统一取消
 
2. 避免闭包中持有大对象引用
闭包会延长变量的生命周期,若内部函数引用了外部的大对象(如 DOM 节点、大型数据结构),即使外部函数执行完毕,这些对象也无法被回收。
3. 合理管理 DOM 引用和缓存
保持对已移除 DOM 元素的引用会阻止整个节点及其关联事件的回收。
- 从文档中移除节点后,确保 JavaScript 中没有变量指向它
 - 使用弱引用结构:如需缓存 DOM 节点,可考虑 WeakMap 或 WeakSet,它们不会阻止垃圾回收
 - 避免全局缓存无限增长,设置过期策略或最大容量
 
4. 使用 WeakMap / WeakSet 替代普通对象做关联存储
当需要将数据与对象关联但不希望影响其生命周期时,WeakMap 和 WeakSet 是更好的选择。
- WeakMap 的键必须是对象,且不可枚举,键被回收时对应条目自动清除
 - 适合用于私有数据存储、元信息附加等场景
 - 不能替代所有 Map 场景,因不支持遍历和大小查询
 
基本上就这些。GC 优化的核心是“及时断联”——只要你不让无用对象继续被可达路径引用,V8 引擎就能高效回收。关注事件、闭包、DOM 和缓存四类高频问题,多数内存问题都能避免。