天天看點

塊級作用域中的變量提升?

由于 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定義,虛拟機會阻止的通路!

繼續閱讀