ES2015引入了两个重要的JavaScript新关键词:let 和 const
这两个关键词在JavaScript 中提供了块作用域(Block Scoped)变量 和常量
ES2015之前只有两种类型的作用域:JavaScript作用域详解
-1JavaScript块作用域
- 通过
var
关键词声明的变量没有块作用域;在块{}内声明的变量可以从块之外进行访问。
例如:
{
var x = 10;
}
//此处可以使用 x
- 使用 let 关键词声明拥有块作用域的变量,在{}内声明的变量无法从块外访问
{
let x = 10;
}
//此处不可以使用x
-2重新声明变量
- -2.1使用var 关键字声明变量:在块中声明变量也将重新声明块外的变量;
例子:
var x = 10;
// 此处 x 为 10
{
var x = 6;
// 此处 x 为 6
}
// 此处 x 为 6
- -2.2使用let关键字不会出现上述问题:
例子:
var x = 10;
// 此处 x 为 10
{
let x = 6;
// 此处 x 为 6
}
// 此处 x 为 10
-3循环作用域
- 在循环中使用 var
var i= 7;
for(var i=0;i<10;i++){
//逻辑
}
//此处 i为10
循环中使用变量var 重新声明了循环外的变量
- 在循环中使用let
let i= 7;
for(let i = 0; i < 10 ; i++){
//逻辑
}
//此处i为7
在循环中使用的变量中使用let并不会重新声明循环外的变量
也就是说在循环中用 let声明了变量i,那么只有在循环内变量i才是可见的。
-4.函数作用域 – 全局作用域 let 和 var相似
-5通过let 关键词定义的全局变量不属于window对象
-6重新声明
- 在相同的作用域,或在相同的块中,通过 let 重新声明一个 var 变量是不允许的
var x = 10; //ok
let x = 6; //不允许
{
var x = 10; //ok
let x = 5; //不允许
}
- 在相同作用域中,或者在相同的块中,通过let重新声明一个let变量是不允许的。
- 在相同作用域或相同块中,通过var 重新声明let变量是不允许的。
- 在不同的作用域或块中,通过let重新声明变量是允许的。
-7提升
通过 let 定义的变量不会被提升到顶端。
在声明 let 变量之前就使用它会导致
ReferenceError。
//在此处,不可以使用myName
let myName;