Uncaught ReferenceError: a is not defined
分為2個(gè)階段:
在預(yù)編譯階段前标,將let聲明的變量放到暫存性死區(qū)TDZ中 TDZ=[a]
當(dāng)let聲明語句結(jié)束之后品抽,這里的結(jié)束指的是,當(dāng)let a = a執(zhí)行完事后茧泪,會把a(bǔ)從TDZ拿出來蜓氨。
但是let a = a執(zhí)行的時(shí)候,右側(cè)賦值的a還在TDZ中队伟,所以報(bào)錯(cuò)穴吹。也就是未聲明就使用的錯(cuò)誤。
所以嗜侮,大家在使用let變量時(shí)港令,切記一定要先聲明后使用
ES6 let與塊級作用域
塊級作用域
什么叫塊級作用域?除了對象字面量上的大括號 都叫塊級作用域
例:{
//產(chǎn)生TDZ[]
var a=10;
let b=100;
//TDZ結(jié)束
}
console.log(a); 10
console.log(b); 報(bào)錯(cuò)
for循環(huán)也是
let 具有識別塊級作用域的能力不存在變量提升
console.log(str); 報(bào)錯(cuò) typeof也不好使
let str=10;
在預(yù)編譯過程中 let 暫時(shí)性死區(qū)(TDZ tempral dead zone)
js掃碼的時(shí)候
- var整體提升
- let a=1; let a放入一個(gè)暫時(shí)性死區(qū) 棘钞,如果使用變量的時(shí)候 在TDZ中發(fā)現(xiàn)變量在里面就報(bào)錯(cuò)
當(dāng)執(zhí)行到let a =1缠借;釋放出來 - 統(tǒng)領(lǐng)當(dāng)前作用域
先定義 再使用
- 不能重復(fù)定義
let a = 'xn'
let a = 'xx' 報(bào)錯(cuò) 已經(jīng)被定義