let命令
基本语法
ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内生效。
{
let a = 10
var b = 1
}
a//未定义a
b//1
上面代码中,分别用let和var声明了两个变量。在代码块外调用了这两个变量,let声明的变量a报错,var声明的变量b返回了正确的值。这表示,let声明的变量只在它所在的代码块内生效
不存在变量提升
var命令所创建的变量,会有变量提升这一现象,即变量可以在声明之前使用,值为undefined。
为了纠正这种现象,let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。
//var
console.log(f1)//输出undefined
var f1 = 1
//let
console.log(f2)//报错
let f2 = 1
上面代码中,变量f1用var命令声明,会发生变量提升,即脚本开始运行时,但没有被赋值,所以输出undefined。变量f2用let命令声明,没有发生变量提升,表示在声明f2之前,f2是不存在的,如果答应则会报错。
暂时性死区
只要会计作用域存在let命令,它所在的变量就绑定(binding)这个区域,不受外部的影响。
var a = 1
{
console.log(a)//报错
let a = 2
console.log(a)//2
}
console.log(a)//1
只要块级作用域类存在let命令,它所声明的变量就会绑定这个区域,不受外部影响。
如果块级作用域中存在let和const命令,这个块作用域对这个命令声明的变量,从一开始就形成了封闭作用域。
暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
不允许重复声明
let不允许在相同作用域内,重复声明同一个变量。
// 报错
function func(){
let a =10
var a =1
}
// 报错
function func(){
let a =10
let a =1
}
因此,不能再函数内部重新声明参数。
function func(arg){
let arg
}
func()// 报错
function func(arg){
{
let arg
}
}
func()// 不报错
总结
- 遵循块级作用域,适用范围不能超出当前块级作用域
- 不能重复声明
- 可赋值,也可以不赋值
- 必须先声明在使用,否则报错
- 全局声明的let变量,不会变成window属性