JavaScript 变量定义:var、let、const

简介

JavaScript 中变量声明经历了从 ES5 的 var 到 ES6(ES2015)引入的 letconst 的演进。理解三者的区别对于编写健壮的 JS 代码至关重要。


var

var 是 ES5 及之前唯一的变量声明方式。

var name = 'Alice';
var age = 25;

特点:

  • 函数作用域:变量在声明它的整个函数内可见,而非块级作用域。
if (true) {
  var x = 10;
}
console.log(x); // 10 — 在块外仍然可访问
  • 变量提升(Hoisting):声明会被提升到函数或全局作用域的顶部,值为 undefined
console.log(a); // undefined(不会报错)
var a = 5;
// 等价于:
// var a;
// console.log(a);
// a = 5;
  • 可重复声明:同一作用域内可以重复声明同名变量,不会报错。
var count = 1;
var count = 2; // 不会报错,count 被重新声明
console.log(count); // 2
  • 可重新赋值:变量的值可以随时改变。

let

let 是 ES6 引入的块级作用域变量声明方式。

let name = 'Bob';
let score = 100;

特点:

  • 块级作用域:变量仅在声明它的代码块 {} 内可见。
if (true) {
  let y = 20;
  console.log(y); // 20
}
console.log(y); // ReferenceError: y is not defined
  • 暂时性死区(Temporal Dead Zone):在声明之前访问变量会报错,不存在变量提升。
console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 10;
  • 不可重复声明:同一作用域内不能重复声明同名变量。
let count = 1;
let count = 2; // SyntaxError: Identifier 'count' has already been declared
  • 可重新赋值:变量的值可以改变。
let total = 50;
total = 100;
console.log(total); // 100

const

const 也是 ES6 引入的,用于声明常量。

const PI = 3.14159;
const API_URL = 'https://api.example.com';

特点:

  • 块级作用域:与 let 相同,仅在块内可见。
if (true) {
  const z = 30;
  console.log(z); // 30
}
console.log(z); // ReferenceError: z is not defined
  • 必须初始化:声明时必须同时赋值。
const MAX_SIZE; // SyntaxError: Missing initializer in const declaration
  • 不可重新赋值:变量绑定不可变,不能指向其他值。
const city = 'Beijing';
city = 'Shanghai'; // TypeError: Assignment to constant variable
  • 对象/数组内容可修改const 只保证变量指向的引用不变,对象属性或数组元素可以修改。
const person = { name: 'Alice' };
person.name = 'Bob';   // 允许
person.age = 30;       // 允许
// person = {};         // 报错

const arr = [1, 2, 3];
arr.push(4);           // 允许
// arr = [];            // 报错
  • 不可重复声明:与 let 相同。

三者对比

特性 var let const
作用域 函数作用域 块级作用域 块级作用域
变量提升 有(值为 undefined) 无(暂时性死区) 无(暂时性死区)
重复声明 允许 不允许 不允许
重新赋值 允许 允许 不允许
必须初始化
推荐程度 不推荐 推荐 优先使用

最佳实践

  1. 优先使用 const:如果变量不需要重新赋值,用 const。这能明确表达意图,避免意外修改。

  2. 需要重新赋值时用 let:当变量值会变化时,使用 let

  3. 避免使用 var:在现代 JavaScript 开发中,var 的作用域规则和提升行为容易导致 bug,应尽量避免使用。

// 推荐写法
const API_KEY = 'abc123';
const users = [];

let counter = 0;
counter++;

// 不推荐
var oldWay = 'avoid this';