JavaScript 中的变量声明方式有哪些?它们有什么区别?

2025年9月10日 by admin

在 JavaScript 中,变量声明有三种主要方式:varletconst。它们的区别主要体现在作用域、提升和可变性等方面。以下是详细说明:

1. var

  • 作用域var 声明的变量是 函数作用域全局作用域。也就是说,如果在函数内部声明,变量只能在该函数内访问;如果在函数外部声明,变量会成为全局变量。
  • 提升var 声明的变量会 提升,即变量声明会被提升到函数或全局作用域的顶部,但赋值不会提升。因此,访问一个尚未赋值的变量会得到 undefined
  • 重复声明var 允许在同一作用域内重复声明同一变量。
console.log(x); // undefined
var x = 5;
console.log(x); // 5

var x = 10; // 没有错误,x 值会被重新赋值为 10

2. let

  • 作用域let 声明的变量是 块级作用域,即它只在 {} 内部有效。
  • 提升let 也会提升,但会进入一个 暂时性死区(Temporal Dead Zone, TDZ),在声明之前访问变量会抛出 ReferenceError
  • 重复声明let 不允许在同一作用域内重复声明同一变量。
// TDZ示例
console.log(x); // ReferenceError: x is not defined
let x = 5;
console.log(x); // 5

let x = 10; // SyntaxError: Identifier 'x' has already been declared

3. const

  • 作用域const 也具有 块级作用域
  • 提升const 会像 let 一样被提升到顶部,但同样会进入暂时性死区,直到声明的位置才可以访问。
  • 可变性const 声明的变量必须在声明时初始化,而且其值不能重新赋值。如果 const 用来声明对象或数组,则对象或数组的内容是可以修改的,但不能重新赋值整个对象或数组。
const x = 5;
console.log(x); // 5
// x = 10; // TypeError: Assignment to constant variable.

const arr = [1, 2, 3];
arr.push(4); // 合法
console.log(arr); // [1, 2, 3, 4]
// arr = [5, 6, 7]; // TypeError: Assignment to constant variable.

总结:

  • var: 函数作用域、允许重复声明、会提升但赋值不提升。
  • let: 块级作用域、不会重复声明、会提升但进入暂时性死区。
  • const: 块级作用域、声明时必须赋值、不会重复声明、值不可重新赋值(但对象内容可以修改)。

通常情况下,推荐使用 letconst,而避免使用 var,因为 letconst 具有更清晰和更安全的作用域控制。