由于 JavaScript 的變量提升存在着變量覆寫、變量污染等設計缺陷,是以 ES6 引入了塊級作用域關鍵字來解決這些問題。
不聊存儲棧和變量環境和**詞法環境(**不清楚的百度)
隻說不知道的let的變量提升
let myname= 'a'
{
console.log(myname)
let myname= 'b'
}
【最終列印結果】:VM458:4 Uncaught ReferenceError: Cannot access ‘myname’ before initialization
at :4:15
【分析原因】:在塊作用域内,let聲明的變量被提升,但變量隻是建立被提升,初始化并沒有被提升,在初始化之前使用變量,就會形成一個暫時性死區。
【拓展】
var的建立和初始化被提升,指派不會被提升。
let的建立被提升,初始化和指派不會被提升。
function的建立、初始化和指派均會被提升。
再舉例:
function test(){
console.log(a)
let a = 5;
}
test()
執行test的時候,編譯階段a已經在記憶體中,為什麼提前通路不了?
這主要是因為V8虛拟機做了限制,雖然a在記憶體中,但是當你在let a 之前通路a時,根據ECMAScript定義,虛拟機會阻止的通路!