IIFE通过立即执行的匿名函数创建独立作用域,封装变量和函数避免全局污染;ES6推荐箭头函数写法,显式传参可适配多环境;现代更应优先使用ES模块替代IIFE。

立即执行函数(IIFE)通过创建独立作用域,把变量和函数封装在内部,避免泄漏到全局环境,从而防止命名冲突和污染。
用 IIFE 包裹代码块
把可能产生全局变量的逻辑写在匿名函数中,并立即调用,让 var/let/const 声明的作用域限制在函数内:
- 传统写法:(function() { var a = 1; console.log(a); })();
- ES6 推荐写法:(() => { const b = 2; console.log(b); })();
- 注意:函数内部用 var 声明的变量不会挂到 window 上,let/const 更安全,完全不提升也不可重复声明
传入全局对象作为参数(显式依赖)
如果需要访问 window 或其他全局对象,显式传入,既清晰又可控:
- (function(global) { global.myUtil = function() {}; })(typeof window !== 'undefined' ? window : globalThis);
- 这样既避免意外覆盖全局属性,也方便在 Node.js 环境中适配(用 globalThis)
- 不直接写 window.xxx = ...,杜绝隐式全局变量
利用模块化替代 IIFE(现代推荐)
IIFE 是 ES5 时代的方案;现在更推荐用 ES Module 或打包工具管理作用域:
立即学习“Java免费学习笔记(深入)”;
- 每个 .js 文件默认是独立模块作用域,顶层 const/let/function 不会暴露到全局
- 需要导出时用 export,需要使用时用 import,依赖关系明确
- 即使没有构建工具,浏览器中也可用 <script type="module"> 启用模块作用域
警惕隐式全局变量陷阱
即便用了 IIFE,以下写法仍会污染全局:
- 忘记 var/let/const 直接赋值:counter = 0; → 自动挂到 window.counter
- 函数内未声明就调用 this 绑定错误,可能意外扩展全局对象
- 建议开启严格模式:"use strict";,让隐式全局赋值报错,提前发现问题


















