先搞懂核心区别(基础前提)
要选对关键字,首先要明确它们的核心差异:
| 特性 | var | let | const |
|---|---|---|---|
| 作用域 | 函数作用域 / 全局 | 块级作用域({} 内) | 块级作用域 |
| 变量提升 | 有(可先使用后声明) | 有(但存在暂时性死区) | 有(同 let) |
| 重复声明 | 允许 | 不允许 | 不允许 |
| 重新赋值 | 允许 | 允许 | 不允许(引用类型仅禁止指向新值) |
| 必须初始化 | 否 | 否 | 是(声明时必须赋值) |
分场景告诉你该用谁
1. 优先用 const(最推荐)
使用场景:声明后不需要重新赋值的变量(包括基本类型、引用类型)。
这是 ES6 后的最佳实践,能让代码更健壮、语义更清晰(明确变量不可被重新赋值)。
javascript
// 1. 基本类型(数值、字符串、布尔等),值固定不变
const PI = 3.14159; // 常量
const NATIONALITY_LIST = ['中国', '美国', '英国']; // 数组(禁止重新赋值数组,但可修改数组内容)
// 2. 引用类型(对象、数组),只要不改变变量的指向,就可以用const
const user = { name: '张三', nationality: 'CN' };
user.nationality = 'US'; // ✅ 允许(只是修改对象属性,没有改变user的指向)
// user = { name: '李四' }; ❌ 禁止(重新赋值,会报错)
// 3. 函数声明(固定的函数引用)
const sayHello = function() {
console.log('Hello');
};
2. 其次用 let
使用场景:声明后需要重新赋值的变量,且需要块级作用域(避免变量泄漏)。
javascript
// 1. 循环变量(最典型场景,避免var的变量提升问题)
for (let i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i); // 输出 0,1,2,3,4(用var会输出5个5)
}, 100);
}
// 2. 条件赋值/后续需要修改的变量
let score = 80;
if (score >= 90) {
score = '优秀';
} else {
score = '良好';
}
// 3. 块内临时变量(仅在{}内有效)
if (true) {
let temp = '临时值';
console.log(temp); // ✅ 正常输出
}
console.log(temp); // ❌ 报错(块级作用域,外部访问不到)
3. 尽量不用 var(仅兼容旧代码场景)
使用场景:几乎不推荐主动使用,仅在需要兼容极旧的 JS 环境(如 IE8 及以下),或维护老项目时遇到已有
var 声明的代码。javascript
// var的问题示例(为什么不推荐)
var a = 1;
var a = 2; // ✅ 允许重复声明(容易出bug)
function test() {
if (true) {
var b = 3;
}
console.log(b); // ✅ 输出3(var是函数作用域,不是块级,变量泄漏)
}
快速判断口诀(新手直接套用)
- 先想:这个变量会不会重新赋值?
- 不会 → 用
const - 会 → 用
let
- 不会 → 用
- 除非遇到老项目必须兼容,否则永远别用
var。
总结
- const:首选,用于 “只读” 变量(禁止重新赋值,引用类型可改内部属性),提升代码可维护性;
- let:用于需要修改值的变量,块级作用域,避免
var的作用域泄漏问题; - var:仅兼容旧代码时使用,现代开发中几乎淘汰,核心问题是函数作用域 + 变量提升易出 bug。
遵循这个原则,你的代码会更规范,也能避免绝大多数变量相关的低级错误。