自执行函数(IIFE)是通过(function(){})()立即执行的函数表达式,用于隔离作用域、防止全局污染;需为表达式形式,可传入window、jQuery等参数,ES6模块化后使用减少但仍有适用场景。

自执行函数(IIFE)是 JavaScript 中隔离作用域、避免全局变量污染的经典方案。它通过立即创建并执行一个函数,让内部变量和函数不会泄露到全局作用域。
什么是自执行函数
自执行函数即 Immediately Invoked Function Expression,写法为:
(function() { /* 代码 */ })(); 或 ((function() { /* 代码 */ })());
关键点在于:函数必须是表达式(用括号包裹),而非函数声明;定义后紧跟 () 立即调用。
如何用 IIFE 防止全局污染
把原本直接写在全局的变量、函数封装进 IIFE 内部,它们就只在该函数作用域中有效:
- 所有 var、let、const 声明的变量都不会挂载到 window(浏览器)或 global(Node.js)上
- 函数内部可自由使用临时变量、工具函数,无需担心命名冲突
- 若需对外暴露接口,显式返回对象或赋值给全局变量(如 window.myLib = {...}),控制权在自己手中
带参数的 IIFE 更灵活
可以传入全局对象、依赖模块或配置项,提升可维护性:
- 传入 window:防止压缩工具误改全局引用,也便于在非浏览器环境适配
- 传入 undefined 作形参:确保内部 undefined 不被外部篡改(ES5 及以前有用)
- 传入 jQuery 或其他库:实现“noConflict”兼容,避免 $ 冲突
示例:
(function(global, $, undefined) {
var privateVar = 'safe';
function helper() { /* ... */ }
global.MyModule = { init: function() {} };
})(typeof window !== 'undefined' ? window : globalThis, jQuery);
现代替代方案与注意事项
IIFE 在 ES6 模块普及后使用减少,但仍有其适用场景:
立即学习“Java免费学习笔记(深入)”;
- 老项目兼容、无构建工具的脚本、需要严格作用域隔离的插件仍广泛使用
- 模块化开发中,import/export 是更推荐的方式,天然隔离作用域
- 注意不要滥用:每个 IIFE 都有独立作用域开销,简单逻辑无需套一层
- 箭头函数不能用作 IIFE(无法被括号转为表达式且无 arguments)










