全局变量是内存泄漏最隐蔽的源头,因逃逸至全局作用域后长期存活;需通过识别隐式声明、扫描window属性、启用严格模式与ESLint、以及主动清理来防控。

全局变量是内存泄漏最隐蔽也最易被忽视的源头。它不依赖复杂逻辑,只要变量“逃逸”到全局作用域,就会一直存活到页面关闭,拖慢性能甚至引发崩溃。
识别隐式全局变量
没用 let、const 或 var 声明就直接赋值,是最典型的泄漏写法:
-
function load() { cache = fetchData(); }→cache自动挂到window.cache -
function User(name) { this.name = name; }→ 若误调User('Tom'),this指向window,name成为全局属性
检查 window 上异常增长的属性
打开 Chrome 控制台,执行以下命令快速扫描可疑项:
-
Object.keys(window).filter(k => !/^(?:chrome|document|location|navigator|performance|screen|self|window)$/.test(k))—— 列出非标准全局属性 -
console.dir(window.yourSuspectVar)—— 查看具体值大小和类型,尤其关注大型数组、对象或 DOM 节点
启用严格模式并配合工具拦截
在文件顶部加 "use strict",能让隐式全局赋值直接报错,从源头杜绝问题:
立即学习“Java免费学习笔记(深入)”;
- 所有脚本或函数开头统一加上该指令
- 配置 ESLint 规则
no-implicit-globals,CI 阶段自动告警 - 构建时启用
no-unused-vars和no-global-assign进一步加固
清理已存在的全局污染
发现泄漏后不能只停在“识别”,还要主动释放:
- 手动置空:
window.leakedData = null或delete window.leakedData - 避免反复覆盖:不要用
window.xxx = {...}持续赋新对象,改用局部变量 + 显式生命周期管理 - 对缓存类全局对象(如
window.__CACHE),定期清理过期项或限制最大条目数


















