IIFE的核心作用是创建独立私有作用域以避免全局污染。它通过函数表达式加立即调用实现词法环境隔离,使内部变量无法被外部访问,常用于兼容旧环境、模块封装及解决循环闭包问题。
立即执行函数(IIFE,Immediately Invoked Function Expression)是定义后立刻运行的函数表达式。它最核心的作用就是创建一个独立的私有作用域,避免变量污染全局命名空间。
JavaScript 在 ES6 之前没有块级作用域(let 和 const 出现前),用 var 声明的变量会提升并挂载到函数或全局作用域。循环中绑定事件、模块隔离、防止全局变量冲突等场景,都容易因作用域不清出问题。
比如下面这段代码:
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100);
}
// 输出:3, 3, 3 —— 因为 i 是全局共享的
它通过“函数表达式 + 立即调用”的组合,让每次执行都生成新的词法环境。函数内部声明的变量只在该次调用的作用域内有效,外部无法访问。
基础形式:
(function () {
var privateVar = '我是私有的';
console.log(privateVar); // ✅ 可访问
})();
console.log(privateVar); // ❌ ReferenceError: privateVar is not defined
带参数的常见用法(常用于模块封装):
var myModule = (function (global) {
var privateData = 42;
function helper() { return privateData * 2; }
return {
publicMethod:
function () {
return helper();
}
};
})(this);
myModule.publicMethod(); // 84
console.log(myModule.privateData); // undefined —— 私有性得到保障
部分场景仍不可替代:
不过日常开发中,优先使用 let/const、模块语法(import/export)和类封装,更简洁且语义清晰。