IIFE是定义后立即执行的函数表达式,用于创建独立作用域以避免全局污染、实现模块模式、解决循环绑定问题;现代ES6+已多用模块、let/const、class等替代。
立即执行函数(IIFE,Immediately Invoked Function Expression)是定义后立刻运行的函数表达式,常见写法是把函数用括号包裹再加一对调用括号:
或
。它的核心作用是创建独立
作用域
,避免变量污染全局环境。
隔离变量,防止全局污染
在没有模块系统的旧代码或
浏览器
脚本中,直接声明变量会挂到
上。IIFE 提供了一个私有作用域,内部声明的
、
、
不会泄露出去。
例如:
立即学习
“
Java免费学习笔记(深入)
”;
实现模块模式和私有成员
IIFE 常配合闭包返回一个对象,暴露有限接口,隐藏内部实现细节。
比如封装一个计数器:
这里的
无法从外部直接修改,实现了数据封装。
Comet AI 浏览器
下载 Comet AI 浏览器,体验由 Perplexity AI 驱动的革命性上网方式。内置 AI 助手可实时总结网页、跨标签页对比信息、自动执行任务。告别繁琐操作,让 AI 成为你的浏览副驾,大幅提升研究与工作效率。支持 Windows、macOS、Android 和 iOS。
下载
避免循环绑定中的常见错误
在 for 循环中给多个元素绑定事件时,若直接用
,回调中取到的往往是最终值。IIFE 可捕获每次迭代的值:
输出:0、1、2(而不是三个 3)。
现代写法更推荐用
替代(块级作用域自动解决):
现代替代方案
ES6 后,多数 IIFE 场景已有更清晰的替代方式:
模块系统(import/export)
:用
显式导出,
按需引入,天然隔离作用域。
块级作用域(let/const)
:替代简单变量隔离需求,如循环中的临时变量。
顶层 await 和模块作用域
:在支持的环境中,模块顶层代码本身就具备私有作用域,无需 IIFE 包裹。
类(class)和私有字段(#field)
:替代模块模式中对私有状态的封装需求。
不过在需要兼容老环境、写无构建流程的纯浏览器脚本,或快速创建一次性作用域时,IIFE 依然简洁有效。
基本上就这些。它不是必须掌握的高级技巧,但理解它能帮你读懂老代码,也更清楚作用域和模块化的演进逻辑。
(function(){ ... })();(( ) => { ... })();windowvarletconst(function() {
var temp = 'private';
console.log(temp); // 可访问
})();
console.log(temp); // ReferenceError: temp is not definedvar Counter = (function() {
let count = 0;
return {
increment() { count++; },
get() { return count; }
};
})();
Counter.increment();
console.log(Counter.get()); // 1countvar ifor (var i = 0; i < 3; i++) {
(function(index) {
setTimeout(() => console.log(index), 100);
})(i);
}letfor (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100);
}exportimport