Uncaught ReferenceError: a is not defined
分为2个阶段:
在预编译阶段,将let声明的变量放到暂存性死区TDZ中 TDZ=[a]
当let声明语句结束之后,这里的结束指的是,当let a = a执行完事后,会把a从TDZ拿出来。
但是let a = a执行的时候,右侧赋值的a还在TDZ中,所以报错。也就是未声明就使用的错误。
所以,大家在使用let变量时,切记一定要先声明后使用
ES6 let与块级作用域
块级作用域
什么叫块级作用域?除了对象字面量上的大括号 都叫块级作用域
例:{
//产生TDZ[]
var a=10;
let b=100;
//TDZ结束
}
console.log(a); 10
console.log(b); 报错
for循环也是
let 具有识别块级作用域的能力不存在变量提升
console.log(str); 报错 typeof也不好使
let str=10;
在预编译过程中 let 暂时性死区(TDZ tempral dead zone)
js扫码的时候
- var整体提升
- let a=1; let a放入一个暂时性死区 ,如果使用变量的时候 在TDZ中发现变量在里面就报错
当执行到let a =1;释放出来 - 统领当前作用域
先定义 再使用
- 不能重复定义
let a = 'xn'
let a = 'xx' 报错 已经被定义