3. JavaScript 变量声明

varletconst 是 JavaScript 中用于声明变量的关键字,但它们在作用域、提升(hoisting)、以及是否可以重新赋值等方面存在一些重要的区别。

1. 作用域(Scope)

  • var

    • 具有函数作用域(function scope),即如果在函数内部声明 var 变量,该变量在整个函数内都有效。
    • 如果在函数外部声明,则具有全局作用域。
    • 不具有块级作用域(block scope),在 iffor 等块级结构内部声明的 var 变量,在块外也能访问。
  • letconst

    • 具有块级作用域,即在 {} 内声明的变量只能在这对大括号内访问。常见的块级结构包括 ifforwhile 等。
    • 这两个关键字在块外无法访问在块内声明的变量。
if (true) {
    var x = 10;
    let y = 20;
    const z = 30;
}
console.log(x); // 10
console.log(y); // ReferenceError: y is not defined
console.log(z); // ReferenceError: z is not defined

2. 提升(Hoisting)

  • var

    • 变量声明会被提升到作用域的顶部,但不会提升赋值操作。也就是说,可以在声明之前使用,但会得到 undefined
  • letconst

    • 变量声明也会被提升,但在变量声明之前访问会导致 ReferenceError,这种现象称为“暂时性死区”(Temporal Dead Zone, TDZ)。
console.log(a); // undefined
var a = 5;

console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 10;

console.log(c); // ReferenceError: Cannot access 'c' before initialization
const c = 15;

3. 重新赋值(Reassignment)

  • var

    • 可以被重新赋值,也可以重复声明同一个变量。
  • let

    • 可以被重新赋值,但不能重复声明同一个变量。
  • const

    • 不能被重新赋值,声明时必须赋值,且值是不可变的(对于基本数据类型)。对于对象和数组等复杂数据类型,引用是不可变的,但对象或数组的内容可以更改。
var a = 10;
var a = 20; // 允许重新声明和赋值

let b = 10;
b = 20; // 允许重新赋值
// let b = 30; // SyntaxError: Identifier 'b' has already been declared

const c = 10;
// c = 20; // TypeError: Assignment to constant variable.

4. 最佳实践

  • 使用 letconst 代替 var 是现代 JavaScript 开发的最佳实践。const 应用于不会重新赋值的变量,let 用于可能会重新赋值的变量。
  • 使用 const 可以让代码更安全,因为它可以防止意外的重新赋值操作。
posted @ 2024-08-28 10:52  muling9955  阅读(11)  评论(0编辑  收藏  举报