优先用const,需重新赋值时用let,基本不用var;var是函数作用域且变量提升后默认undefined,let/const是块级作用域且存在暂时性死区,const声明必须初始化且绑定不可变。

直接说结论:优先用 const,需要重新赋值时改用 let,基本不用 var。
作用域决定能不能“被外面看到”
var 是函数作用域,写在 if 或 for 里,块外照样能访问;let 和 const 是块级作用域,只在 { } 内有效。
- if(true) { var a = 1; } console.log(a); // ✅ 输出 1
- if(true) { let b = 2; } console.log(b); // ❌ 报错:b is not defined
- const 同样受块级限制,不能跨 {} 使用
变量提升和暂时性死区影响“能不能提前用”
var 声明会被提升到作用域顶部,但值是 undefined;let 和 const 虽然声明也提升,但声明前访问会直接报错(暂时性死区)。
- console.log(x); var x = 10; // ✅ 输出 undefined
- console.log(y); let y = 20; // ❌ 报错:Cannot access 'y' before initialization
- const z = 30; // 声明必须同时赋值,否则语法错误
可变性决定“能不能改值”
const 不是“值不可变”,而是“绑定不可变”——它不允许你把变量指向另一个内存地址。
- const arr = [1, 2]; arr.push(3); // ✅ 允许,数组内容可变
- const obj = {}; obj.name = 'Alice'; // ✅ 允许,对象属性可变
- const arr = [1]; arr = [2]; // ❌ 报错:Assignment to constant variable
- let count = 0; count = 1; // ✅ 正常赋值
实际怎么选:三步判断法
写代码前快速问自己三个问题:
- 这个值从定义起就不再变了?→ 用 const(比如 API 地址、配置项、DOM 元素引用)
- 需要在后续逻辑中多次修改?→ 用 let(比如循环计数器、状态标志、临时计算结果)
- 有没有必须用 var 的场景?→ 几乎没有。函数作用域、变量提升、重复声明这些特性现在都是隐患,不是优势


















