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
尤其适用于声明那些不应该被重新赋值的常量。