IIFE通过创建独立函数作用域封装变量和函数,防止其挂载到window或全局对象造成污染;基本写法为(function(){})(),需括号确保解析为表达式,可传参暴露接口或返回闭包控制访问。

用立即执行函数(IIFE)保护全局环境,核心是把变量和函数封装在独立作用域里,避免污染 window(浏览器)或全局对象。
为什么需要 IIFE 来隔离作用域
JavaScript 在函数外部声明的变量默认挂到全局对象上。比如直接写 var count = 0;,就会变成 window.count,可能被其他脚本意外修改或覆盖。IIFE 利用函数作用域的封闭性,在执行完后让内部变量自动“消失”,不留在全局中。
基本写法:括号包裹 + 立即调用
常见写法有两种,本质相同,都是让 JS 引擎识别为函数表达式而非函数声明:
(function() { /* 代码 */ })();(function() { /* 代码 */ }());
注意:必须用括号把整个函数包起来,否则 JS 会报语法错误——因为 function(){}() 被解析为函数声明后紧跟括号,语法非法。
立即学习“Java免费学习笔记(深入)”;
传参与返回值:控制内外数据流动
IIFE 不只是“躲变量”,还能有意识地暴露接口、接收依赖:
- 向内传参:比如传入
window、undefined或第三方库,既压缩体积又防篡改:(function(global, undefined) { console.log(global === window); })(window); - 向外返回:用
return输出一个对象或函数,只暴露需要的部分:var utils = (function() { var privateVar = 'secret'; return { get: function() { return privateVar; } }; })();
这样privateVar无法从外部访问,但utils.get()可以安全使用。
现代替代方案:块级作用域更简洁
ES6 后,let / const 和模块(import/export)已成主流:
- 简单隔离用
{ let x = 1; console.log(x); }—— 块级作用域,x不会泄漏 - 模块文件默认私有,顶层声明不会进入全局,比 IIFE 更自然、可读性更强
- IIFE 现在多用于兼容老环境、UMD 包封装,或需动态执行一次性逻辑的场景
不过理解 IIFE 仍有助于读懂早期代码和底层封装逻辑。


















