核心是防止变量污染全局作用域:启用严格模式报错拦截隐式全局;用ES模块提供天然隔离作用域;老代码用IIFE封装;声明优先使用let/const避免var提升泄漏。

核心是不让变量“掉进”全局作用域——浏览器里一不留神,count = 10 或 var config = {} 就会变成 window.count 和 window.config,污染命名空间、引发覆盖、增加调试成本。
启用严格模式
在脚本顶部加上 "use strict";。它会让未声明就赋值的操作直接报错,而不是悄悄挂到 window 上。比如:
-
function foo() { x = 1; }→ 严格模式下抛ReferenceError,而非创建window.x - 所有隐式全局、
with语句、八进制字面量等不安全行为都会被拦截
用 ES 模块替代传统 script
把 <script src="main.js"></script> 换成 <script type="module" src="main.js"></script>。模块天然拥有独立顶层作用域:
-
const API_URL = '...';只在当前文件内有效,不会出现在window上 - 函数、类、变量默认私有,必须
export才能被其他模块使用 - 模块自动启用严格模式,无需手动加
"use strict"
老代码或第三方脚本用 IIFE 封装
对无法立即模块化的代码,用立即调用函数表达式创建隔离作用域:
立即学习“Java免费学习笔记(深入)”;
-
(function () { let internal = 'safe'; console.log(internal); })();→internal完全与window隔离 - 如需对外暴露,只主动挂一个命名空间对象:
window.MyLib = { init(), utils },避免零散挂载
声明时优先用 let/const,禁用 var
var 的函数作用域和变量提升容易导致意外泄漏;let 和 const 具备块级作用域,更可控:
-
if (true) { let x = 1; }→ 外部访问x直接报错 -
if (true) { var y = 2; }→y被提升并绑定到函数或全局作用域 - 循环中推荐
for (let i = 0; i ,避免闭包取值错误


















