在 JavaScript 中,var
和 let
都是用于声明变量的关键字,但是它们在作用域、变量提升和重复声明方面有所不同。
作用域
使用 var
声明的变量是函数作用域或全局作用域的变量。这意味着在声明它的函数内或全局作用域内都可以访问该变量。而使用 let
声明的变量是块级作用域的变量,这意味着它们只在声明它们的块中可见。例如,在一个循环体内声明的变量只能在该循环体内访问。
比如说下面的代码,在if中定义的变量,在if块外仍然能访问。
function example() {
var x = 1;
if (true) {
var x = 2;
console.log(x); // 输出 2
}
console.log(x); // 输出 2
}
function example() {
let x = 1;
if (true) {
let x = 2;
console.log(x); // 输出 2
}
console.log(x); // 输出 1
}
变量提升
使用 var
声明的变量会被提升到函数或全局作用域的顶部,这意味着可以在声明之前使用。而使用 let
声明的变量则不会被提升,试图在声明之前使用会导致引用错误。
console.log(x); // 输出 undefined
var x = 10;
console.log(y); // 报错 ReferenceError
let y = 20;
重复声明
使用 var
可以重复声明同一个变量,而后面的声明会覆盖前面的声明。而使用 let
则不能在同一作用域内重复声明同一个变量。
var x = 10;
var x = 20; // 合法,后面的声明会覆盖前面的声明
let y = 30;
let y = 40; // 不合法,会报错 SyntaxError
let
和 var
的最大区别在于作用域的不同。
建议在 ES6 及其之后的版本中使用 let
或 const
声明变量,以便创建块级作用域变量并避免全局命名冲突等问题。