在ES5及更早环境中,var无块级作用域,需用IIFE创建独立作用域并利用闭包“记住”值,以隔离变量、防止污染、解决循环中异步回调读取最后i值的问题,并可封装为工具函数或用于安全模块化。

在 ES5 及更早环境(比如 IE8–9)中,var 没有块级作用域,for 或 if 里的变量会泄漏到外层函数或全局。要安全隔离变量、避免污染和闭包陷阱,核心是用函数创建独立作用域,并靠闭包“记住”当时的值——IIFE(立即执行函数表达式)就是最直接可靠的手段。
用 IIFE 封装单次块逻辑,隔离临时变量
把一段只执行一次、不需要复用的代码包进匿名函数并立刻调用,内部 var 就不会跑到外面去。
- 写法:`(function () { var tmp = 'hello'; console.log(tmp); })();`
- 外部访问
tmp会报ReferenceError,因为它只活在那个函数作用域里 - 适合场景:初始化配置、防污染的计算、一次性 polyfill 注入、DOM 临时处理等
在循环中固定每次迭代的值,解决“全输出最后一个数”问题
ES5 里用 var i 循环 + 异步回调(如 setTimeout),所有回调最终都读到循环结束后的 i 值。必须让每个回调“锁住”自己那轮的 i。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 正确写法:`for (var i = 0; i console.log(arr[index]), 100); })(i); }`
- 关键点:把当前
i当参数传进 IIFE,内部形成闭包,持续引用这个index - 也可以直接传值:`(function (item) { console.log(item); })(arr[i]);`,更直观,尤其适合不依赖索引的操作
封装成可复用的“伪块作用域”工具函数
如果项目里多处需要这种模式,可以抽象一个语义清晰的辅助函数,既保持兼容性,又方便后期迁移到 let。
立即学习“Java免费学习笔记(深入)”;
- 示例:function block(fn, ...args) { return fn.apply(null, args); }
- 使用:
for (var i = 0; i console.log('第', j, '次'), i); } - 本质仍是 IIFE + 参数传递,但调用时意图明确,也利于统一替换或加调试逻辑
配合闭包做安全封装,保护配置和私有状态
不只是隔离变量,更是构建防御性模块:把敏感配置、校验逻辑、初始化标志等“锁”在闭包里,只暴露可控接口。
- 例如防重复执行:IIFE 内用
var initialized = false,返回的函数先检查再执行 - 保护白名单:配置对象定义在闭包顶层,只提供
getConfig().apiHost这类只读访问,不返回原始引用 - 老旧浏览器兼容:即使
let不被识别,也能用var+ IIFE + 命名空间前缀(如_safe_)保证私有性

















