iife用于初始化复杂全局变量以解决污染、隔离和一次性执行问题,通过闭包封装逻辑并仅暴露必要变量,支持参数注入与防重定义,现代环境优先用es模块替代。

在JavaScript中,用IIFE(立即执行函数表达式)初始化复杂全局变量,主要是为了解决变量污染、依赖隔离和一次性初始化的问题。核心思路是把初始化逻辑封装在闭包里,只暴露最终需要的变量到全局作用域。
基础写法:定义并立即执行
最简形式是将对象或函数的构建过程包裹在括号内,后接()执行:
window.MyApp = (function() {
const config = { apiBase: 'https://api.example.com', timeout: 5000 };
const utils = {
formatDate: function(date) { return date.toISOString().split('T')[0]; },
throttle: function(fn, delay) { /* ... */ }
};
return {
config,
utils,
version: '1.2.0'
};
})();
这样MyApp成为全局变量,内部config和utils不会泄漏,且只执行一次。
带参数的IIFE:支持环境或配置注入
如果初始化依赖外部值(如window、document或模块前缀),可传参增强灵活性:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
(function(global, doc, prefix) {
const namespace = prefix + 'Core';
global[namespace] = {
init: function() {
console.log('Ready in', doc.title);
return this;
}
};
})(window, document, 'My');
// 全局变量:window.MyCore
这种写法便于测试(可传入mock对象)和多环境适配(如开发/生产不同prefix)。
防重复定义与安全挂载
避免多次加载脚本时覆盖已有变量,可在挂载前检查:
- 用global[name] = global[name] || {...}做浅合并(适合扩展)
- 更稳妥的做法是仅当未定义时才初始化:if (!global.MyLib) { global.MyLib = {...}; }
- 配合'use strict'防止意外创建全局变量
现代替代建议:优先考虑ES模块
IIFE适合老环境(如IE)或UMD打包场景。若目标环境支持ES6+,更推荐:
- 用export导出,由模块系统统一管理依赖
- 用const MyApp = Object.freeze({...})替代IIFE,语义更清晰
- 通过构建工具(如Rollup/Vite)自动处理全局暴露,无需手写IIFE
不过在微前端、遗留系统或CDN直引场景中,IIFE仍是可靠的选择。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










