IIFE 是定义后立即执行的函数表达式,用于创建私有作用域、避免全局污染并实现简易模块化;ES6 模块语法和现代工具链使其逐渐被取代。

立即执行函数(IIFE,Immediately Invoked Function Expression)是 JavaScript 中一种定义后立刻运行的函数表达式。它的核心形式是:(function(){ /* code */ })(); 或 (function(){ /* code */ }()); —— 用括号将函数包裹,再加一对末尾括号触发执行。
它解决了变量作用域污染问题
在 ES6 模块出现之前,浏览器中所有 script 标签共享全局作用域。如果多个脚本都声明 var counter = 0;,就会互相覆盖或意外修改。IIFE 利用函数作用域形成“私有沙箱”:内部用 var、let、const 声明的变量不会泄露到全局。
- 外部无法访问 IIFE 内的 temp 或 helper
- 多个 IIFE 彼此隔离,互不影响
- 适合封装插件、工具库、初始化逻辑等独立功能块
它支持模块化的基础模式:暴露接口
IIFE 常通过返回对象或赋值给全局变量来“导出”有限能力,实现简易模块化:
- 返回一个对象:var MyModule = (function(){ return { init: function(){} }; })();
- 挂载到 window:(function(root){ root.Utils = { ... }; })(window);
- 支持依赖注入:(function($, _) { /* 使用 jQuery 和 Lodash */ })(jQuery, _);
这种写法在 RequireJS、早期 jQuery 插件、Bootstrap JS 源码中非常常见。
立即学习“Java免费学习笔记(深入)”;
为什么现在很少用了
ES6 原生引入了 模块语法(import/export) 和 块级作用域(let/const),配合打包工具(Webpack、Vite)和浏览器原生模块支持,已能更安全、更清晰地组织代码。
- 模块自动隔离作用域,无需手动包一层函数
- 静态分析更准确(IIFE 是运行时结构,import 是编译时声明)
- Tree-shaking、循环依赖处理、类型推导等现代能力依赖标准模块格式
如今 IIFE 主要出现在需要兼容极老环境、生成自执行脚本(如 UMD 包)、或某些构建产物中,不再是主动编写的首选模式。











