在 ES6(ECMAScript 2015)中,var
、let
和 const
是用于声明变量的三种方式,它们有几个关键的区别。
1. 作用域
var
: 声明的变量会被提升到其函数或全局作用域的顶部。let
和const
: 声明的变量仅在其块级作用域(block scope)内有效。
示例:
javascript
function demoVar() {
if (true) {
var x = 1; // x 可以在整个函数作用域内访问
}
console.log(x); // 输出 1
}
function demoLet() {
if (true) {
let y = 1; // y 仅在这个块级作用域内有效
}
console.log(y); // ReferenceError: y is not defined
}
2. 重复声明
var
: 允许重复声明同一个变量。let
和const
: 不允许在同一个作用域内重复声明同一个变量。
示例:
javascript
var x = 1;
var x = 2; // 有效
let y = 1;
let y = 2; // SyntaxError: Identifier 'y' has already been declared
const z = 1;
const z = 2; // SyntaxError: Identifier 'z' has already been declared
3. 可变性
var
和let
: 声明的变量可以重新赋值。const
: 声明的变量不能重新赋值,但如果它是一个对象或数组,其内部状态是可以被改变的。
示例:
javascript
var x = 1;
x = 2; // 有效
let y = 1;
y = 2; // 有效
const z = 1;
z = 2; // TypeError: Assignment to constant variable.
const obj = { prop: 1 };
obj.prop = 2; // 有效
4. 提升(Hoisting)
var
: 变量会被提升,但只有声明会被提升,初始化(如果有)则不会。let
和const
: 声明不会被提升,访问变量前必须声明。
示例:
javascript
console.log(a); // 输出 undefined
var a = 1;
console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 1;
console.log(c); // ReferenceError: Cannot access 'c' before initialization
const c = 1;
这些是 var
、let
和 const
的主要区别。在现代 JavaScript 开发中,通常推荐使用 let
和 const
,因为它们提供了块级作用域和不可变性,这有助于编写更清晰、更易维护的代码。