非严格模式下隐式变量声明会自动挂载到全局对象(如window),导致命名空间污染和内存泄漏;严格模式则通过"use strict"拦截未声明赋值,抛出ReferenceError,强制显式声明。

隐式变量声明在非严格模式下会直接挂载到全局对象(window 或 globalThis),造成命名空间污染和内存泄漏风险;而严格模式能第一时间拦截这类错误,避免隐患潜伏。
看是否触发“未声明赋值”却无报错
这是最直观的信号:代码中出现类似 x = 100、userList = [] 这类没有 let/const/var 前缀的赋值语句,但运行时没抛出 ReferenceError —— 那基本说明当前处于非严格模式,该变量已被自动挂为全局属性。
- 检查脚本顶部是否有
'use strict';或等效的模块级严格上下文(ES6 模块默认严格) - 在浏览器控制台执行
(function(){return this===window;})(),若返回true且你写了temp = {},随后window.temp可访问,即证实隐式挂载
查全局对象上异常新增的属性
隐式声明的变量会成为全局对象的自有属性,长期驻留内存,尤其在单页应用中易被反复覆盖或累积。
- 在 DevTools 控制台运行
Object.keys(window).filter(k => !/^(?:document|location|navigator|console|performance)/.test(k)),观察是否存在业务无关、命名随意的键名(如data、res、tmp) - 对比页面加载前后
Object.keys(globalThis)的差异,可快速定位初始化阶段悄悄挂上的变量
结合内存快照识别闭包泄漏链
隐式全局变量一旦持有函数(尤其是箭头函数或事件回调),就可能意外捕获外层作用域的大对象,形成无法回收的引用链。
- 在 Memory 面板录制 Heap Snapshot,筛选类型为
Closure,查看其Retainers是否包含window.xxx或globalThis.xxx - 若某个闭包的
Retained Size明显偏高,且其内部可访问到已卸载组件的this.state或大型缓存数组,大概率是隐式变量作为“中转站”长期持有了它
用 ESLint 主动拦截潜在写法
靠人工审查难以覆盖所有角落,建议配置静态检查工具提前预警。
- 启用
no-implicit-globals规则(适用于 script 标签环境)或no-unused-vars+no-undef组合(推荐) - 在 VSCode 中安装 ESLint 插件,保存时实时标红
foo = 'bar'类语句,并提示 “'foo' is not defined” - 对遗留项目,可先开启
/* eslint-disable no-implicit-globals */逐步治理,避免一次性报错过多










