iife通过括号将函数转为表达式并立即执行,创建独立作用域防止全局污染;支持传参、返回值及模块封装,适用于es5环境、umd打包及需动态闭包的场景。

立即执行函数(IIFE)通过创建独立的作用域,防止变量和函数泄漏到全局作用域。核心在于:**用括号将函数表达式包裹,并紧跟一对调用括号**,让 JS 引擎将其识别为表达式而非函数声明,从而可立即执行且不污染全局。
基本写法:括号 + 调用
标准 IIFE 写法有两种常见形式,本质相同:
-
(function() { /* 代码 */ })(); —— 先用括号把函数变成表达式,再加
()执行 - (function() { /* 代码 */ }()); —— 调用括号直接写在函数表达式末尾
两者都确保内部定义的 var、let、const 和函数名(非 function f() {} 声明式)不会挂载到 window 或 globalThis 上。
避免意外暴露:慎用 function 声明和 this
在非严格模式下,IIFE 内部的 this 指向全局对象,若不小心用 this.x = 1 就会污染全局。更隐蔽的是:如果在 IIFE 中写了 function foo() {}(函数声明),它仍可能被提升并挂到全局(尤其在老浏览器或非严格模式中)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 推荐用函数表达式:
const foo = function() {};或const foo = () => {}; - ✅ 开启严格模式:
(function() { 'use strict'; /* ... */ })();,此时this为undefined,且禁止隐式全局赋值
传参与模块化雏形
IIFE 可接收外部变量(如 window、jQuery),既隔离又可控:
(function(global, $) {
const privateVar = 'safe';
function helper() { /* 只在内部可见 */ }
global.MyLib = { init() { /* 对外暴露的接口 */ } };
})(typeof window !== 'undefined' ? window : globalThis, jQuery);
这样既避免了 privateVar 和 helper 进入全局,又把 MyLib 显式挂到目标对象上,清晰可控。
ES6 后的替代方案
现代开发中,export / import 和模块文件天然隔离作用域,无需手动 IIFE。但在无构建环境、需兼容旧浏览器,或临时封装逻辑时,IIFE 仍是轻量可靠的选择。注意:用 let/const 定义的变量本就块级作用域,但 IIFE 提供了额外一层执行上下文封装,对避免命名冲突和管理生命周期仍有价值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










