JavaScript Let
块作用域
在 ES6 (2015) 之前,JavaScript 没有块作用域。
JavaScript 具有全局作用域和函数作用域。
ES6 引入了两个新的 JavaScript 关键字:let 和 const。
这两个关键字在 JavaScript 中提供了块作用域
示例
在 { } 块内声明的变量无法从块外部访问
{
let x = 2;
}
// x 在这里不能使用
全局作用域
使用 var 声明的变量始终具有全局作用域。
使用 var 关键字声明的变量不能具有块作用域
示例
在 { } 块内使用 var 声明的变量可以从块外部访问
{
var x = 2;
}
// x 在这里可以使用
不能重新声明
使用 let 定义的变量不能重新声明。
您不能意外地重新声明一个使用 let 声明的变量。
使用 let,您不能这样做
let x = "John Doe";
let x = 0;
使用 var 定义的变量可以重新声明。
使用 var,您可以这样做
var x = "John Doe";
var x = 0;
重新声明变量
使用 var 关键字重新声明 JavaScript 变量可能会导致问题。
在块内重新声明变量也会重新声明块外的变量
使用 let 关键字重新声明变量可以解决此问题。
在块内重新声明变量不会重新声明块外的变量
var、let 和 const 之间的区别
| 作用域 | 重新声明 | 重新赋值 | 声明提升 | 绑定 this | |
| var | 否 | 是 | 是 | 是 | 是 |
| let | 是 | 否 | 是 | 否 | 否 |
| const | 是 | 否 | 否 | 否 | 否 |
什么好?
let 和 const 具有块作用域。
let 和 const 不能重新声明。
let 和 const 必须在使用前声明。
let 和 const不绑定到 this。
let 和 const未被提升。
什么不好?
var 不必声明。
var 被提升。
var 绑定到 this。
浏览器支持
Internet Explorer 11 或更早版本不支持 let 和 const 关键字。
下表定义了完全支持的第一个浏览器版本
| Chrome 49 | Edge 12 | Firefox 36 | Safari 11 | Opera 36 |
| 2016 年 3 月 | 2015 年 7 月 | 2015 年 1 月 | 2017 年 9 月 | 2016 年 3 月 |
重新声明
在程序的任何地方都可以使用 var 重新声明 JavaScript 变量
使用 let,在同一块中重新声明变量不允许
示例
var x = 2; // 允许
let x = 3; // 不允许
{
let x = 2; // 允许
let x = 3; // 不允许
}
{
let x = 2; // 允许
var x = 3; // 不允许
}
在另一个块中重新声明变量使用 let,允许
Let 声明提升
使用 var 定义的变量被提升到顶部,并且可以随时初始化。
含义:您可以在声明变量之前使用它
如果您想了解更多关于声明提升的信息,请学习 JavaScript Hoisting 章节。
使用 let 定义的变量也被提升到块的顶部,但未初始化。
含义:在声明之前使用 let 变量将导致 ReferenceError