在JavaScript中,var
、let
和 const
都是用来声明变量的关键字。通常推荐使用 let
和 const
来代替 var
,以避免一些由于变量提升和作用域问题导致的潜在错误。
1. 变量作用域
- var
声明的变量具有局部作用域(在函数中使用)或全局作用域(非函数区域内使用)
- let
和 const
声明的变量具有块级作用域
var a = 1; // 全局作用域
function testScope() {
var x = 5; // 函数作用域
if (true) {
let y = 10; // 块级作用域
const z = 15; // 块级作用域
console.log(x, y, z); // 5, 10, 15
}
console.log(x, y, z); // 5, ReferenceError: y is not defined, ReferenceError: z is not defined
}
console.log(a); // 1
testScope();
2. 变量提升
- var
声明的变量会被提升到其作用域的顶部,并且初始化为 undefined
- let
和 const
声明的变量也会被提升,但在声明之前访问会导致引用错误(暂时性死区)
console.log(a); // undefined
var a = 3;
// 以上代码实际编译过程
var a;
console.log(a); // undefined
a = 3;
// 以下代码会导致ReferenceError
console.log(b);
let b = 3;
3. 重复声明
- var
可以在同一作用域内重新声明同一个变量
- let
和 const
在同一作用域内不能重新声明同一个变量,let在不同作用域有重复声明不会报错
var color = "blue";
var color = "red"; // 允许
// 下面的代码会导致SyntaxError
let size = "medium";
let size = "large";
// 下面的代码会导致SyntaxError
const shape = "circle";
const shape = "square";
4. 变量赋值
- var
和 let
声明的变量可以被重新赋值
- const
用来定义常量,在声明 const
变量的同时必须给它赋一个初始值
- const
声明的变量是常量,一旦赋值后就不能再改变。但对于对象或数组等复杂类型,内部属性是可以修改的,只是不能将 const
变量本身重新指向一个新的对象或数组
var count = 1;
count = 2; // 允许
let quantity = 3;
quantity = 4; // 允许
const max = 5;
// max = 6; // TypeError: Assignment to constant variable.
const person = { name: "Alice" };
person.name = "Bob"; // 允许,因为只改变了对象的内容,而不是指向的对象本身