var变量无块级作用域,只遵循函数或全局作用域,其声明在预编译阶段被提升至当前函数或全局顶部,故在if、for等{}块内声明会“穿透”并泄露到外层函数作用域中。

var 声明的变量没有块级作用域,它只遵循函数作用域(或全局作用域),因此在 if、for、while 等控制流语句的花括号 {} 内声明的 var 变量,会“泄露”到外层函数或全局中。
为什么 var 会穿透块级作用域
JavaScript 引擎在预解析(hoisting)阶段会把所有 var 声明提升到当前作用域顶部(注意:只是声明,不包括赋值)。而 var 的作用域边界不是花括号 {},而是最近的 函数体 或全局环境。所以无论 var 写在函数内的哪一层 {} 里,它都属于整个函数作用域。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
典型穿透示例
以下代码运行后不会报错,且能正常访问:
function example() {
if (true) {
var x = 10;
}
console.log(x); // 输出 10 —— x 在 if 外仍可访问
}
for (var i = 0; i console.log(i), 100);
}
// 输出 3 次 3 —— 因为只有一个 i,循环结束时 i === 3
与 let/const 的关键区别
- var:函数作用域,允许重复声明,存在变量提升(声明被提升,赋值不提升)
- let/const:块级作用域({} 为界),不允许重复声明,有暂时性死区(TDZ),不存在变量提升意义上的“可访问”
如何避免意外穿透
- 优先使用 let 或 const 替代 var,尤其在 for 循环、if 分支等块内声明变量时
- 若必须用 var,确保理解其作用域仅限于函数——把它当作“函数内全局变量”来对待
- 避免在嵌套块中用 var 声明同名变量,否则会覆盖外层同名 var(无块隔离)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










