核心是防止变量污染全局作用域,主要手段包括:iife创建私有作用域、优先使用es模块、命名空间对象收敛、块级作用域限制及启用严格模式。

核心是不让变量“掉进”全局作用域——用作用域当围墙,把代码关进自己的房间,只留一扇你亲手开的门。
用 IIFE 主动创建私有作用域
这是最直接、兼容性最强的老办法,尤其适合不支持模块的老环境或需要手动加载的脚本。
- 标准写法:
(function() { let count = 0; function init() {} })();——count 和 init 完全不会出现在 window 上 - 想暴露接口?只挂你明确同意的:
(function(global) { global.myTool = { version: '1.0' }; })(window); - 多个 IIFE 并存互不干扰,哪怕都叫
utils或render,也各自清净
优先走 ES 模块(ESM)路径
现代项目默认就该用这个。每个 .js 文件天然自带顶级作用域,变量不显式导出,外界根本看不见。
- 确保引入方式是
import { fn } from './utils.js';,而不是<script src="utils.js"></script> - 打包工具(Vite/Webpack)会自动把非模块脚本包进函数作用域,帮你兜底
- 注意老库可能仍往
window上挂东西(比如window.$),这时优先换它的 ESM 版本,或配externals隔离
用命名空间对象做轻量收敛
适合渐进改造、插件封装或必须暴露少量全局入口的场景。
- 只声明一个全局对象:
if (!window.MyApp) window.MyApp = {};,再把所有内容挂它下面 - 例如:
window.MyApp.api = { login() {}, logout() {} };,window.MyApp.config = {...} - 关键点:提前检查是否存在,避免覆盖;但要提醒团队——别绕过它直接写
var helper = ...,否则前功尽弃
靠块级作用域收窄泄漏边界
ES6 的 let 和 const 虽不能替代模块,但在局部能有效防误伤。
- 别在
if或for块里用var,改用let/const:{ const tmp = 'ok'; } console.log(tmp); // 报错 - 配合 IIFE 使用,比如整个配置块包一层:
(function() { const cfg = { debug: true }; /* ... */ })(); - 严格模式下,隐式全局变量(如忘记
var直接赋值)会直接报错,倒逼规范写法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











