JavaScript中var、let和const关键字区别解析

在 JavaScript 中,var、let 和 const 是用于声明变量的关键字,它们之间有几个关键的区别,主要体现在作用域、提升(hoisting)以及可变性上。以下是它们的详细区别:
1. 作用域(Scope)
var:var声明的变量具有函数作用域(function scope),这意味着它们在声明它们的函数内部是可见的。如果在函数外部声明,则具有全局作用域。let和const:let和const声明的变量具有块级作用域(block scope),这意味着它们在声明它们的块(如{})内部是可见的。块级作用域包括if语句、for循环等。
function example() {
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:var声明的变量会被提升到其作用域的顶部,但只有声明会被提升,赋值不会。这意味着你可以在声明之前访问变量,但其值为undefined。let和const:let和const也会被提升,但它们不会被初始化。在声明之前访问它们会导致ReferenceError,这种现象被称为“暂时性死区”(Temporal Dead Zone, TDZ)。
console.log(a); // undefined
var a = 10;
console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 20;
console.log(c); // ReferenceError: Cannot access 'c' before initialization
const c = 30;
3. 可变性
var和let:var和let声明的变量可以被重新赋值。const:const声明的变量不能被重新赋值,但如果是对象或数组,其属性或元素可以被修改。
var a = 10;
a = 20; // 合法
let b = 10;
b = 20; // 合法
const c = 10;
c = 20; // TypeError: Assignment to constant variable.
const obj = { prop: 10 };
obj.prop = 20; // 合法
4. 重复声明
var:在同一个作用域内,var允许重复声明同一个变量。let和const:在同一个作用域内,let和const不允许重复声明同一个变量。
var a = 10;
var a = 20; // 合法
let b = 10;
let b = 20; // SyntaxError: Identifier 'b' has already been declared
const c = 10;
const c = 20; // SyntaxError: Identifier 'c' has already been declared
5. 全局对象属性
var:在全局作用域中,var声明的变量会成为全局对象(如window对象)的属性。let和const:在全局作用域中,let和const声明的变量不会成为全局对象的属性。
var a = 10;
console.log(window.a); // 10
let b = 20;
console.log(window.b); // undefined
const c = 30;
console.log(window.c); // undefined
总结
var:函数作用域,允许重复声明,变量提升且初始化为undefined。let:块级作用域,不允许重复声明,变量提升但不初始化(暂时性死区)。const:块级作用域,不允许重复声明,变量提升但不初始化(暂时性死区),且不能重新赋值。
在现代 JavaScript 开发中,推荐使用 let 和 const,因为它们提供了更严格的作用域控制和更好的代码可维护性。const 尤其适用于声明那些不应该被重新赋值的常量。