談談變量提升?

談談變量提升?

當執行 JS 代碼時,會生成執行環境,只要代碼不是寫在函數中的,就是在全局執行環境中,函數中的代碼會產生函數執行環境,只此兩種執行環境

  • 接下來讓我們看一個老生常談的例子,var
b() // call b
console.log(a) // undefined

var a = 'Hello world'

function b() {
    console.log('call b')
}

變量提升

這是因爲函數和變量提升的原因。通常提升的解釋是說將聲明的代碼移動到了頂部,這其實沒有什麼錯誤,便於大家理解。但是更準確的解釋應該是:在生成執行環境時,會有兩個階段。第一個階段是創建的階段,JS 解釋器會找出需要提升的變量和函數,並且給他們提前在內存中開闢好空間,函數的話會將整個函數存入內存中,變量只聲明並且賦值爲 undefined,所以在第二個階段,也就是代碼執行階段,我們可以直接提前使用

在提升的過程中,相同的函數會覆蓋上一個函數,並且函數優先於變量提升

b() // call b second

function b() {
    console.log('call b fist')
}
function b() {
    console.log('call b second')
}
var b = 'Hello world'

複製代碼var 會產生很多錯誤,所以在 ES6中引入了 letlet 不能在聲明前使用,但是這並不是常說的 let 不會提升,let 提升了,在第一階段內存也已經爲他開闢好了空間,但是因爲這個聲明的特性導致了並不能在聲明前使用

個人博客地址:大家可以看看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章