var声明变量具有函数作用域,通过IIFE可实现局部隔离、修复循环闭包陷阱、模拟私有变量,但存在变量提升和重复声明不报错问题,现代开发推荐let/const。

JavaScript 中 var 声明的变量具有函数作用域(function scope),而非块级作用域。这意味着只要在函数内用 var 声明,变量就只在该函数体内可见,可用来隔离局部状态,避免污染外部或全局作用域。
利用函数包裹创建独立作用域
把需要隔离的变量和逻辑封装进一个函数中,再立即执行(IIFE),就能确保内部 var 变量不泄露到外层:
- 用
(function(){ ... })()或(function(){ ... }())包裹代码 - 在内部用
var声明变量,它们仅在该函数内有效 - 外部无法访问这些变量,实现真正的局部隔离
例如:
var count = 0;(function() {
var count = 10; // 与外层 count 无关
console.log(count); // 输出 10
})();
console.log(count); // 输出 0 —— 外层未被修改
避免 for 循环中 var 变量的闭包陷阱
var 在函数作用域内声明,循环中的 var i 实际上是整个函数共用一个绑定。若在循环内创建异步操作(如 setTimeout),所有回调会共享同一个 i 值。可通过 IIFE 为每次迭代创建独立作用域来修复:
立即学习“Java免费学习笔记(深入)”;
- 把循环体放进自调用函数,并把当前
i作为参数传入 - 参数在每次调用时形成新绑定,从而隔离每次迭代的状态
示例:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
setTimeout(() => console.log(index), 100);
})(i);
} // 输出:0、1、2(顺序可能因定时器而异,但值正确)
模块化封装:用函数模拟私有变量
借助 var 的函数作用域 + 返回对象/函数,可以模拟“私有变量”:
- 在函数内部用
var声明变量,外部不可直接访问 - 返回一个对象,其方法通过闭包引用内部
var变量 - 外部只能通过暴露的方法间接操作,实现数据封装
例如:
function createCounter() {var value = 0;
return {
increment: function() { value++; },
getValue: function() { return value; }
};
} const counter = createCounter();
counter.increment();
console.log(counter.getValue()); // 1
// 无法直接访问或修改 value
注意:var 的变量提升与重复声明
var 存在变量提升(hoisting),声明会被移到函数顶部,但赋值不会。这可能导致意外行为:
- 即使在条件语句或循环中声明,
var也会在整个函数作用域内生效 - 重复用
var声明同一变量名不会报错,而是被忽略 - 建议始终在函数顶部集中声明
var变量,提高可读性与可控性
例如:
function example() {console.log(x); // undefined(不是 ReferenceError)
var x = 5;
}
现代开发更推荐使用 let 和 const 实现块级作用域,但在维护旧代码或需兼容低版本环境时,掌握 var 的函数作用域特性仍很实用。

















