在 JavaScript 中,关键字 var
和 let
都用于声明变量。
let
关键字是在 JavaScript 的较新版本,即 **ES6(ES2015)** 中引入的。它是声明变量的首选方式。
JavaScript let 与 var
以下是 let
和 var
之间差异的概述。
let | var |
---|---|
let 是块级作用域。 | var 是函数作用域。 |
let 不允许重新声明变量。 | var 允许重新声明变量。 |
let 不会发生提升(Hoisting)。 | var 会发生提升(Hoisting)。 |
JavaScript let 与 var 在局部作用域中的区别
var 是函数作用域
在函数内部使用 var
声明的变量可以在函数内的任何地方使用。例如:
// program to print text
// variable a cannot be used here
function greet() {
// variable a can be used here
var a = 'hello';
console.log(a);
}
// variable a cannot be used here
greet(); // hello
在上面的程序中,变量 a 是用 var
声明的。变量 a 可以在 greet
函数内的任何地方使用。
let 是块级作用域
使用 let
声明的变量只能在代码块内访问。例如:
// program to print the text
// variable a cannot be used here
function greet() {
let a = 'hello';
// variable b cannot be used here
if(a == 'hello'){
// variable b can be used here
let b = 'world';
console.log(a + ' ' + b);
}
// variable b cannot be used here
console.log(a + ' ' + b); // error
}
// variable a cannot be used here
greet();
输出
hello world Uncaught ReferenceError: b is not defined
在上面的程序中,变量 a 在函数内部声明,并且可以在函数内的任何地方访问(a 成为函数作用域)。
然而,变量 b 在 if
块语句内部声明。 b 将具有块级作用域,并且只能在 if
块内部访问。
因此,当您尝试在 if
块外部访问 b 时,会发生错误(如上面程序所示)。
注意:在函数内部声明的变量对于 var
和 let
都将是函数作用域。
let 不允许重新声明变量
1. 使用 var
声明的变量可以再次重新声明。例如:
var a = 5; // 5
var a = 3; // 3
使用 let
声明的变量不能在同一块或同一作用域内重新声明。例如:
let a = 5;
let a = 3; // error
输出
Uncaught SyntaxError: Identifier 'a' has already been declared
2. 在不同的作用域或块中用 var
重新声明变量也会改变外部变量的值。例如:
var a = 5;
console.log(a); // 5
{
var a = 3;
console.log(a); // 3
}
console.log(a); // 3
在不同的作用域或块中用 let
重新声明变量,会将该变量视为一个不同的变量。并且外部变量的值不会改变。例如:
let a = 5;
console.log(a); // 5
{
let a = 3;
console.log(a); // 3
}
console.log(a); // 5
3. 当在循环中使用 var
声明的变量时,该变量的值会发生变化。例如:
var a = 2;
for(var a = 0; a < 3; a++) {
console.log('hello');
}
console.log(a); // 3
在上面的程序中,for
循环重新声明了变量 a。因此,a
的值在最后变为 **3**。
当在循环中使用 **let** 声明的变量时,变量的值不会改变。例如:
let a = 2;
for(let a = 0; a < 3; a++) {
console.log('hello');
}
console.log(a); // 2
在上面的程序中,for
循环将变量 a 视为一个与上面声明的变量不同的变量。该变量的作用域仅在 for
循环内部。因此,变量 a 的值在最后保持为 **2**。
let 不允许变量提升
用 var
声明的变量会被提升到程序作用域的顶部。例如:
console.log(a);
var a; // undefined (not an error)
let
关键字不允许变量提升。例如:
console.log(a);
let a; // Uncaught ReferenceError: a is not defined
如果您想了解更多关于变量提升的信息,请访问 JavaScript 变量提升。
let 和 var 的浏览器支持情况
大多数现代浏览器都支持使用 let
。但是,一些浏览器并不完全支持 let
。
要了解更多信息,请访问 JavaScript let 浏览器支持。
注意:在全局作用域的情况下,var
和 let
的行为方式相同。例如:
var a = 5; // 5
变量 a 将具有全局作用域,并且可以在程序中的任何位置访问。
let a = 5; // 5
变量 a 将具有全局作用域,并且可以在程序中的任何位置访问。