自执行匿名函数(iife)是通过立即执行匿名函数表达式来隔离作用域、防止全局污染的javascript经典模式,常见写法有(function(){})()、!function(){}等,支持传参与闭包,适用于旧环境兼容、一次性初始化及循环绑定等场景。

自执行匿名函数(IIFE)是 JavaScript 中隔离作用域、避免全局变量污染的经典方案。它通过立即执行一个函数表达式,让内部声明的变量、函数只在该函数作用域内有效,不会泄漏到全局作用域。
什么是自执行匿名函数(IIFE)
IIFE 的基本写法是将匿名函数用括号包裹,并在末尾加一对圆括号来立即调用:
(function() {
var localVar = '我不会污染全局';
console.log(localVar);
})();
// 此时 localVar 在外部无法访问
console.log(typeof localVar); // "undefined"
关键点在于:函数是表达式(不是声明),且被立即调用。括号强制 JS 引擎将其解析为表达式,从而允许后面接 () 执行。
常见 IIFE 写法与注意事项
有多种合法写法,本质相同,都是让函数变成表达式:
-
(function(){ ... })();—— 最常用,清晰易读 -
(function(){ ... }());—— 把调用括号包进外层括号里 -
!function(){ ... }();—— 利用逻辑非操作符强制表达式化(也常用在压缩工具中) -
void function(){ ... }();—— 使用 void 确保返回 undefined,适合某些严格场景
注意:不能写成 function(){ ... }();(缺少外层括号),否则会被解析为函数声明,而函数声明不能直接加 () 调用,会报语法错误。
传参与模块化雏形
IIFE 可接收参数,常用于导入全局对象(如 window、document)或依赖库(如 $),既提高性能又避免重命名风险:
(function(global, $) {
var myUtil = { /* 工具方法 */ };
global.myLib = myUtil; // 显式挂载到全局(可控)
})(typeof window !== 'undefined' ? window : globalThis, jQuery);
这种模式是早期模块化的基础,比如 jQuery 插件常用它来确保 $ 安全可用,同时不干扰其他库的 $。
现代替代方案与适用场景
ES6 模块(import/export)和 const/let 块级作用域已大幅减少对 IIFE 的依赖。但在以下情况仍实用:
- 需要兼容不支持模块的旧环境(如 IE)
- 一次性初始化逻辑,且不想暴露任何内部变量
- 封装立即执行的副作用代码(如监听、定时器、DOM 就绪检查)
- 作为闭包工厂,生成多个独立作用域(如循环中绑定索引)
例如修复 for 循环中事件监听器取值问题:
for (var i = 0; i console.log(index), 100); })(i); } // 输出 0, 1, 2;而不是三个 3
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











