iT邦幫忙

1

hoisting問題

gameking93 8 月前4514 瀏覽

在 javascript 中 hoisting 指的是 " 一種把宣告提升到其所在區域內頂端的行為"。

在網路上有看到這句話

但不理解 所謂的"所在區域內頂端"指的是哪裡

看過一些範例code 還是不太懂

1 個回答

2
海綿寶寶
iT邦超人 1 級 ‧ 8 月前
最佳解答

乍看我還以為拼錯字了
/images/emoticon/emoticon25.gif

W3Schools寫得很好
不妨參考看看

看更多先前的回應...收起先前的回應...
海綿寶寶 iT邦超人 1 級 ‧ 8 月前 檢舉

簡單說,有兩點:

  1. 變數可以先使用,後宣告(宣告(declaration)會被提到最上面)
  2. 只有**宣告(declaration)會被提到最上面,設初值(initialization)**不會
gameking93 iT邦新手 5 級 ‧ 8 月前 檢舉

好哦 忽然看到W3schools有介紹到這篇

感謝建議~~

gameking93 iT邦新手 5 級 ‧ 8 月前 檢舉

謝謝回答~~

fillano iT邦超人 1 級 ‧ 8 月前 檢舉

路過補充,再精確一點的話...

Javascript執行到一個函數時,會依照這樣的順序處理不認識的名稱 (identifier):

  1. 把函數參數加到變數的搜尋鏈(scope chain,執行時會到這裡找關鍵字之外的名稱的定義)
  2. 把函數宣告加進去
  3. 開始執行程式,碰到變數宣告,就把他加進去
  4. 碰到未宣告的名稱,會先在本地的scope chain尋找,沒找到就到外面一層尋找(假設目前執行的函數,外面還包著一個函數),就這樣一路往外搜尋。如果搜尋到Global(在所有函數之外)還沒找到這個名稱,在嚴格模式(ECMA-262 Edition 5加入)就會拋出錯誤。如果不是在嚴格模式,就會在Global Scope建立這個名稱的變數。

只有函數宣告會被抬升,函數變數、變數宣告並不會,這些都會依照順序處理。

這樣是函數宣告(function declaration):

function test() {
...
}

這樣是函數變數(function expression):

var test = function() {
...
}
海綿寶寶 iT邦超人 1 級 ‧ 8 月前 檢舉

/images/emoticon/emoticon33.gif

gameking93 iT邦新手 5 級 ‧ 8 月前 檢舉

@fillano 感謝補充 受益良多~~

我要發表回答

立即登入回答