在JavaScript中,var
、let
和const
都用于声明变量,但它们之间有一些重要的区别:
作用域:
var
声明的变量是函数作用域(function-scoped),在整个函数内部可见。let
和const
声明的变量是块级作用域(block-scoped),在声明的块(如if语句或循环)内部可见。function example() { if (true) { var x = 10; // var 在整个函数内可见 let y = 20; // let 在 if 块内可见 const z = 30; // const 在 if 块内可见 } console.log(x); // 10 console.log(y); // ReferenceError: y is not defined console.log(z); // ReferenceError: z is not defined }
变量提升:
var
存在变量提升(hoisting),即变量可以在声明之前被访问,但值为undefined
。let
和const
也有提升,但不会被赋值,访问会报ReferenceError
。console.log(a); // undefined var a = 5; console.log(b); // ReferenceError: b is not defined let b = 10;
重复声明:
- 在同一作用域内,
var
可以被重复声明。 let
和const
不允许在同一作用域内重复声明相同的变量名。var x = 5; var x = 10; // 合法 let y = 15; let y = 20; // SyntaxError: Identifier 'y' has already been declared const z = 25; const z = 30; // SyntaxError: Identifier 'z' has already been declared
- 在同一作用域内,
全局对象属性:
- 在全局作用域中使用
var
声明的变量会成为全局对象的属性(在浏览器中是window
对象)。 let
和const
声明的全局变量不会成为全局对象的属性。var globalVar = 42; console.log(window.globalVar); // 42 let globalLet = 42; console.log(window.globalLet); // undefined const globalConst = 42; console.log(window.globalConst); // undefined
- 在全局作用域中使用
初始化和重新赋值:
var
可以在声明的同时初始化,也可以在之后重新赋值。let
可以在声明的同时初始化,但不能在之后重新用let
对相同的变量名进行声明。const
必须在声明的同时初始化,并且不能在之后重新赋值。var a = 5; a = 10; // 合法 let b = 15; b = 20; // 合法 const c = 25; c = 30; // TypeError: Assignment to constant variable
总的来说,使用 let
和 const
更推荐,因为它们提供了更好的作用域规则,避免了一些 var
带来的问题。 const
用于声明常量,一旦初始化就不能被重新赋值。 let
用于声明可变的变量。