var允许重复声明,即同一作用域内多次用var声明同名变量不会报错,引擎仅执行首次声明,后续var声明被静默忽略,赋值操作才影响变量值;而let和const禁止重复声明,否则立即报错。

var 变量可以重复声明,意思是:在同一个作用域内,用 var 多次声明同一个变量名,不会报错,也不会创建多个变量,而是视为对已有变量的“重新声明”,实际效果等同于一次声明 + 多次赋值(如果带赋值的话)。
为什么能重复声明?本质是“声明被忽略”
JavaScript 引擎在处理 var 时,会把所有 var 声明提前到作用域顶部(变量提升),但**重复的 var 声明会被引擎静默忽略**——只有第一次声明真正起作用,后续的 var x 不再分配新内存或改变作用域行为。
- 哪怕写
var a = 1; var a = 2; var a = 3;,也只算一次变量声明 - 中间的
var a不会触发重新初始化,也不会清空原值 - 真正影响值的是等号右边的赋值操作,不是 var 关键字本身
它和赋值、作用域的关系
重复声明本身不等于覆盖值,是否改值取决于有没有赋值语句:
-
var x = 10; var x;→ x 还是 10(第二次没赋值,无变化) -
var x = 10; var x = 20;→ x 变成 20(第二次赋值生效) -
var x = 10; if (true) { var x = 30; }→ x 最终是 30(var 无块级作用域,两次都在同一函数/全局作用域)
容易踩坑的典型场景
重复声明常掩盖逻辑错误,尤其在条件分支或多人协作中:
- 本想在 if 里定义局部变量,却误用 var,导致污染外层作用域
- 复制粘贴代码时多写了一行
var count = 0;,看似无害,实则可能覆盖前面的计算结果 - 函数参数名和内部 var 声明同名,比如
function fn(x) { var x = 5; }—— 参数 x 会被 var 声明“遮蔽”,初始值丢失
对比 let/const 就更清楚
let 和 const 明确禁止重复声明,哪怕只是 let a; let a; 也会立即报错 Identifier 'a' has already been declared。这种严格性正是为了解决 var 的模糊性。而 var 的“宽容”不是设计优势,是历史包袱——ES6 引入 let/const 后,日常开发中应避免使用 var 重复声明。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











