注冊分為三個階段:分別是注冊階段,函數處理階段,變量處理階段;這三個階段有先后順序的。(注:這三個階段的名字沒有權威性,是作者為了方便記憶自己起的名字)
注冊階段的特征
1.此時不會運行代碼
2.檢查低級的語法錯誤
3.注冊在當前詞法環境中所聲明的變量和函數
4.一旦創建了新的詞法環境,就會執行這一階段
函數處理階段
如果是函數環境(也就是說局部環境):創建形參及函數參數的默認值;然后實參形參相統一。 如果全局環境,就跳過這這一步
接下來是全局環境和函數環境都經歷的:將函數聲明進行掃描并綁定到當前環境與函數名相同的標識符上。若該標識符已經存在,那么該標識符的值將被重寫。(注意此時不會理會函數表達式和箭頭函數)
對變量進行處理
若在全局作用域中或者函數作用域中。掃描三種變量 var 、let、const定義的變量。
若是塊級作用域:掃描兩種變量 let、const定義的變量。對于所查找到的變量,若該標識符不存在,進行注冊并將其初始化為undefined。若該標識符已經存在,將保留其值。
?