全局变量因始终活跃而无法被垃圾回收,须通过严格模式、模块封装、手动解引、WeakMap等手段防控内存泄漏。

全局变量不会被垃圾回收器清理,因为它们始终处于活跃作用域中,生命周期贯穿整个程序运行期。要避免因此引发的内存泄漏,关键在于控制变量作用域、及时解除引用,并建立明确的释放机制。
用严格模式限制隐式全局变量
不加 var、let 或 const 声明的变量会自动挂载到全局对象(如 window),成为无法回收的隐式全局变量。启用严格模式可直接报错阻止这类行为。
- 在脚本顶部添加 "use strict";
- 现代模块系统(ESM)默认启用严格模式,推荐使用 import/export 替代 script 标签直连
- 避免直接给 window 或 globalThis 赋值,尤其不要用 window.myData = {...} 方式暴露数据
用模块封装替代全局命名空间
把逻辑按功能拆分为独立模块,通过显式导出必要接口,而非将大量变量堆在全局。
- 每个模块只暴露最小必需 API,内部变量自然受限于模块作用域
- 避免创建类似 window.AppUtils 或 window.DataStore 这类巨型全局对象
- 若需跨模块共享状态,优先用单例类或依赖注入,而不是挂载到全局
手动解除引用,配合生命周期管理
即使变量声明在全局,只要不再需要,就应主动切断其对大对象(如 DOM 元素、数组、闭包)的引用。
立即学习“Java免费学习笔记(深入)”;
- 对不再使用的全局对象赋值为 null 或 undefined,例如:myBigData = null;
- 在组件卸载、页面跳转、模块销毁时,清理全局缓存对象:delete window.cacheMap[key];
- 避免让全局变量持有定时器、事件监听器、Promise 回调等长期存活的引用链
用 WeakMap / WeakSet 管理关联数据
当必须为某些对象附加元信息又不想阻碍其回收时,WeakMap 是更安全的选择——它的键是弱引用,目标对象被回收后,对应条目自动消失。
- 例如:用 WeakMap 存储 DOM 元素的私有配置,而不是往元素上挂 element.__config
- 不适用于需要长期保留关联关系的场景,但能有效防止因“附属数据”拖住主对象不被回收
- 注意 WeakMap 不可枚举,也不支持 clear(),设计时需预留清理入口(如配套的 Map 记录 key)


















