提升現象Hoisting

執行環境的兩個階段,JS特別的地方在使用變數之前,不一定要先宣告,只要相同環境底下其他地方有宣告,就不會發生錯誤,原因是因為在Global ex. Context的時候會進行記憶體的指派流程,這就是Hoisting的關鍵,JS執行的時候,看到你宣告變數,雖然不知道你的指派的內容是什麼,但還是先幫你保留記憶體空間
  • 如果是var變數宣告的話,會被指派undefined代表尚未賦值
  • 若是function宣告的話,因為會將整個函式存入記憶體空間,所以在宣告function前呼叫function是沒問題的
  • 這些變數記憶體空間被保留到全域記憶體(Global Memory)或稱記憶體空間(Heap)
  • 只有存在記憶體空間還沒被賦值的階段被稱為創造階段,創造階段結束後才會進入執行階段,正式一行一行執行程式,宣告的變數才被賦值
  • Const 與 Let的提升行為,與var不同,雖然都會先預留記憶體空間,但是不會被指派預設值undefined,在執行階段,如果再未被指派數值前使用,會回報錯誤(Can’t access XXX before initialization)
  • Const/Let宣告變數再賦值前無法取用的區間稱為Temporal Dead Zone