var 具有函数作用域和变量提升特性,声明被提升至作用域顶部但赋值不提升,导致声明前访问返回 undefined;无块级作用域,易造成变量泄露;es6 推荐用 let/const 替代以避免此类问题。

var 是 JavaScript 中最早期的变量声明方式,它有函数作用域和变量提升(hoisting)特性,理解它对读懂老代码和避免常见 bug 很重要。
var 声明的基本用法
使用 var 声明变量时,语法简单:
- 可以只声明不赋值:
var age;,此时值为undefined - 可以声明并初始化:
var name = "Alice"; - 支持一次声明多个变量:
var a = 1, b = 2, c = 3; - 允许重复声明同一变量名(不会报错,后一次赋值会覆盖):
var x = 1; var x = 2;→x最终为2
变量提升(Hoisting)是怎么回事
var 声明会被“提升”到其所在作用域(函数或全局)顶部,但只有声明被提升,赋值不会。
例如:
console.log(a); // undefined(不是 ReferenceError) var a = 10;
实际执行等价于:
var a; // 声明提升 console.log(a); // undefined a = 10; // 赋值保留在原位置
- 提升的是声明,不是初始化;所以访问未赋值的 var 变量得到
undefined,而非报错 - 在声明前使用变量是安全的(不会崩溃),但结果往往不符合预期
- 函数内部的 var 会提升到函数顶部,不影响外层作用域
var 的作用域特点
var 没有块级作用域(如 if、for 内部),只有函数作用域和全局作用域。
if (true) {
var x = 100;
}
console.log(x); // 100 —— x 泄露到了外层作用域
- 在
if或for块中用 var 声明,变量仍属于当前函数或全局作用域 - 这容易导致意料之外的变量覆盖或污染,也是后来引入 let 和 const 的主要原因
为什么现在不推荐用 var
ES6 之后,let 和 const 成为主流,因为它们更符合直觉和工程需求:
- let/const 有块级作用域,避免变量泄露
- let/const 不允许重复声明,减少错误
-
let/const 虽然也有提升,但存在“暂时性死区”(TDZ):在声明前访问会直接报
ReferenceError,而不是返回undefined - const 明确表达不可重新赋值的意图,提升可读性和安全性
除非维护旧项目或需要兼容极老环境,否则建议统一使用 let(需重新赋值)或 const(默认首选)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











