iife是定义后立即执行的函数表达式,用于创建独立作用域、避免全局污染;常见写法为(function(){})(),可传参、返回值,并在es6模块普及后多用于兼容场景。

通过立即执行函数表达式(IIFE)可以创建一个独立的作用域,让内部定义的变量、函数不会污染全局命名空间,从而实现私有命名空间的隔离。
什么是 IIFE
IIFE 是定义后立刻执行的函数,常见写法是把函数声明用括号包裹,再在末尾加一对括号调用:
```js(function() {
var privateVar = '我是私有的';
function privateFunc() { console.log(privateVar); }
// 这些在外部无法直接访问
)();
```
此时 privateVar 和 privateFunc 只存在于该函数内部作用域中,外部作用域访问不到,自然就隔离了命名空间。
带参数和返回值的 IIFE
实际开发中常需要传入依赖(如 window、undefined)或导出接口。典型写法:
(function(global, undefined) {
'use strict';
var myModule = {};
myModule.publicMethod = function() {
var secret = '仅模块内可见';
return secret.toUpperCase();
};
global.MyLib = myModule; // 显式挂载到全局
})(typeof window !== 'undefined' ? window : globalThis);
```
这样既保护了内部变量,又可控地暴露了公共 API。
ES6 之后的替代方案
虽然 IIFE 在 ES5 时代广泛用于模块封装,但现代 JavaScript 更推荐使用原生模块(import/export)或 const/let 块级作用域:
-
const和let在块(如{}、if、for)中声明,也具有私有性 - 模块文件默认是私有作用域,顶层声明不会自动挂载到全局
- IIFE 现在多用于兼容老环境、UMD 包封装或需要立即执行逻辑的场景
注意点
避免常见错误:
- 不要漏掉外层括号或调用括号,否则会变成函数声明而非表达式,导致语法错误
- 箭头函数不能直接用作 IIFE(因无
arguments且不能被 new),需显式包装:(( ) => { /*...*/ })() - 在严格模式下,IIFE 内部的
this默认为undefined,可配合参数明确绑定
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











