核心是不让变量“掉进”全局作用域;启用严格模式让隐式赋值报错,es模块天然隔离顶层作用域,iife封装老代码,优先用let/const替代var。

避免全局变量污染,核心是让变量和函数待在该待的地方——不“掉进”全局作用域。浏览器里直接写 count = 10 或 var config = {},它们就自动成了 window.count 和 window.config,容易被覆盖、难调试、影响协作。
启用严格模式("use strict")
这是最基础的防线:它让隐式挂载全局变量的行为直接报错,而不是悄悄塞进 window。
- 脚本顶部加
"use strict";,整段脚本进入严格模式 - 函数内第一行写
"use strict";,只约束该函数作用域 - ES 模块(
<script type="module"></script>或.mjs)默认启用严格模式,无需手动加 - 比如写
userId = "abc"(没声明),严格模式下立刻抛ReferenceError,而不是静默创建window.userId
用 ES 模块替代传统 script 标签
模块天然隔离顶层作用域,是最现代、最彻底的方案。
- 所有
const、let、function声明默认私有,不会出现在window上 - 必须显式
export,再由其他模块import使用,依赖关系清晰可查 - 把
<script src="main.js"></script>改成<script type="module" src="main.js"></script> - 还能支持 tree-shaking、类型推导和静态分析,长期维护更可靠
用 IIFE 封装非模块化代码
对老项目、第三方脚本或暂时无法模块化的代码,IIFE 是简单有效的兜底方式。
- 写成
(function() { "use strict"; /* 所有逻辑放这里 */ })(); - 内部定义的变量、函数完全与
window隔离 - 如需暴露接口,只主动挂一个命名空间对象,例如
window.MyApp = { init(), utils },避免零散挂载 - 配合 ESLint 的
no-implicit-globals规则,能自动检测隐式全局
优先用 let/const,禁用 var
var 的函数作用域和变量提升容易导致意外泄漏,而 let/const 具备块级作用域,更可控。
-
if (true) { let x = 1; }→ 外部访问x报错,安全 -
if (true) { var y = 2; }→y提升并绑定到函数或全局作用域,风险高 - 循环中用
for (let i = 0; )能避免闭包取值错误,也是作用域隔离的一环 - 建议开启 ESLint 的
no-var规则,强制使用let/const
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











