IIFE通过函数作用域隔离实现模块化封装,核心是私有变量不污染全局、仅通过return对象暴露最小接口,并支持依赖注入与命名空间收敛。

过去在 ES6 模块尚未普及、构建工具不常见的年代,IIFE 是防止全局变量污染最主流、最可靠的手法。它不依赖任何外部环境,纯靠 JavaScript 语言本身的函数作用域机制,就能把变量“关起来”,只留一扇可控的门对外通信。
用函数作用域天然隔离变量
JavaScript 中,函数会创建独立作用域,而 IIFE 就是立刻执行的函数表达式——所有在它内部用 var、let 或 const 声明的变量,都只属于这个临时作用域,不会自动挂到 window 或 globalThis 上。
-
(function() { var a = 1; let b = 2; const c = 3; })();执行完后,a、b、c全部不可访问 - 对比
var a = 1;直接写在顶层,就会变成window.a,污染全局
只暴露最小必要接口
IIFE 不是单纯“藏起来”就结束,而是有意识地决定哪些东西该被外部使用。通常通过 return 一个对象,把真正需要的函数或配置“放出来”,其余全保持私有。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 比如计数器模块:
var counter = (function() { let count = 0; return { inc() { count++; }, get() { return count; } }; })(); - 外部只能调
counter.inc()或counter.get(),无法篡改count本身 - 多个类似模块(如
utils、api)各自 IIFE,互不影响命名
显式传入依赖,避免隐式全局引用
老项目常依赖 window、document、jQuery 等。IIFE 支持参数传入,让依赖关系清晰可见,也便于测试和迁移。
立即学习“Java免费学习笔记(深入)”;
- 典型写法:
(function(global, doc, $) { /* 使用 global、doc、$ */ })(typeof window !== 'undefined' ? window : globalThis, document, jQuery); - 这样既兼容浏览器和 Node.js 环境,又防止代码里随意写
document.getElementById这类隐式全局调用 - 连
undefined都可作为形参传入,避免低版本 IE 中被重写的风险
配合命名空间减少全局占位
即使必须暴露全局标识符,IIFE 也常和单一命名空间配合使用,把多个模块收敛到一个“总入口”下,大幅压缩污染面。
- 先声明:
window.MyLib = window.MyLib || {}; - 再在 IIFE 里挂载:
MyLib.utils = { ... };、MyLib.ajax = { ... }; - 最终只占用一个
window.MyLib,而不是几十个零散变量

















