最直接有效的方式是启用严格模式("use strict"),配合显式声明和模块化开发;它让错误在发生时立刻暴露,如未声明赋值抛referenceerror、模块顶层变量默认私有、esm天然启用严格模式并需export/import显式控制作用域。

最直接有效的方式是启用严格模式("use strict"),配合显式声明和模块化开发。它不是靠提醒或约定,而是让错误在发生时立刻暴露出来。
用 "use strict" 激活语法级防护
在脚本顶部或函数体开头加上这行代码,就能触发 JavaScript 引擎的严格检查:
- 未声明就赋值(如
count = 10)会立即抛出ReferenceError,而不是悄悄挂到window.count或globalThis.count上 -
eval内部声明的变量不再泄漏到外层作用域,避免动态代码污染全局 - 对只读属性赋值、给不可扩展对象添加属性等操作也会报
TypeError,防止意外修改全局对象行为
始终显式声明变量
不管在全局还是函数内,所有新变量都必须用 let、const 或(仅兼容旧环境时)var 明确声明:
- 避免写
result = x + y,应写成const result = x + y - 警惕链式赋值陷阱:例如
var a = b = 0实际上等价于var a = (b = 0),b仍是隐式全局——正确写法是分开声明:let a, b; a = b = 0 -
var声明的全局变量无法被delete删除,而隐式创建的可以,这也说明后者本质是全局对象的可删属性,不是真正的变量
优先使用 ES 模块(ESM)
现代项目中,把代码组织成 .js 模块文件或用 <script type="module"></script> 加载,天然规避隐式全局问题:
- 模块顶层的
const、let、function默认私有,不会自动挂到window上 - 模块默认启用严格模式,即使不写
"use strict",未声明赋值也直接报错 - 暴露功能必须通过
export显式导出,导入必须用import明确声明依赖,逻辑边界清晰
辅助手段增强保障
单靠人写代码容易疏漏,建议叠加工具层防御:
- 用 ESLint 配置规则如
no-implicit-globals和no-unused-vars,在编辑器和构建阶段拦截风险代码 - 在 CI 流程中加入静态检查,阻止带隐式全局的代码合入主干
- 老项目迁移时,可先对关键模块加
"use strict",再逐步转为模块结构
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











