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