立即执行函数(iife)是定义后立即调用的函数,通过创建独立词法作用域防止变量污染全局环境;支持返回对象有选择地暴露接口,利用闭包实现封装,常用于老项目作用域隔离,es6后推荐模块化替代。

JavaScript 中用立即执行函数(IIFE)隔离变量作用域,核心是利用函数创建独立的作用域,防止变量污染全局环境或与其他代码冲突。
什么是立即执行函数(IIFE)
IIFE 是定义后立刻运行的函数,语法通常为 (function(){ ... })() 或 (( ) => { ... })()(注意箭头函数不能直接 IIFE,需额外括号包裹)。它会形成一个新的词法作用域,内部声明的 var、let、const 都不会泄露到外层。
用 IIFE 隔离变量避免全局污染
在没有模块系统的老项目或浏览器脚本中,直接写 var count = 0; 会挂到 window 上。用 IIFE 包裹后,变量就私有了:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
<script><br> (function() {<br> var message = "hello";<br> console.log(message); // 可访问<br> })();<br> console.log(message); // ReferenceError: message is not defined<br> </script>
- IIFE 内部的
var仍受函数作用域限制,不会变成全局变量 -
let和const在 IIFE 中效果相同,且更推荐(块级作用域更严格) - 外部完全无法访问 IIFE 内部变量,实现天然封装
通过返回值有选择地暴露接口
IIFE 不只是“藏起来”,还能主动导出需要的变量或函数:
const utils = (function() {
let counter = 0;
function increment() { return ++counter; }
function reset() { counter = 0; }
return { increment, reset };
})();
utils.increment(); // 1
utils.increment(); // 2
utils.reset();
utils.increment(); // 1
- 闭包让内部变量
counter被increment和reset持有,长期存在但不可直接修改 - 只暴露方法,不暴露数据,符合封装原则
- 多个 IIFE 可各自维护独立状态,互不影响
常见使用场景和注意事项
IIFE 常用于插件开发、老式模块模拟、循环绑定事件等需要作用域隔离的地方。
- 在
for循环中给按钮绑定点击事件时,不用 IIFE 容易所有回调共享同一个i值;用(function(i){ ... })(i)可捕获当前轮次的值 - ES6 后推荐优先用
let声明循环变量(块级作用域),或用模块(import/export),IIFE 更多用于兼容或特殊封装需求 - 不要滥用:现代 JS 已有更清晰的模块机制,IIFE 适合补位,不是首选方案
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










