1 預解析函數
1.1 預解析的基本步驟內存
在JS引擎執行JS代碼會分紅三個步驟進行解析代碼:作用域
第一步:JS引擎先將JS代碼總體按照JS語言的規則進行分詞,也就是JS代碼的詞法分析.io
第二步:而後JS引擎瀏覽JS代碼,並對代碼進行語法分析,這裏只關注代碼中變量的聲明和函數的聲明,這第二步也就叫預解析.function
第三步:從上往下,從左到右的執行代碼.變量
第一和第二步都是在執行代碼前JS引擎內部執行的過程,尤爲是第二步預解析的過程對JS代碼的執行順序有着極其重要的影響.語法
而對於變量的聲明和函數的聲明,這兩種聲明在執行預解析的時候效果也是不一樣的.語言
1.2 變量聲明的預解析過程數字
變量的聲明是經過關鍵字var來實現的
.當JS引擎遇到var時會首先在當前做用域中查找是否有聲明過這個變量名,若是沒有就在當前做用域中添加這個變量,若是有那該次聲明就被視爲無效.
1.3 函數聲明的預解析
函數的聲明分爲兩種:
經過function函數聲明的方式聲明函數,在預解析的時候,首先在當前做用域中查找是否有聲明過這個函數名的變量,若是沒有在當前做用域中添加該函數名的變量,若是有則再也不重複聲明,而後給這個變量進行賦值,賦的值就是這個函數.
可是經過函數字面量方式聲明的函數就至關於變量的聲明,因此函數字面量聲明的狀況和變量聲明的預解析過程同樣.不考慮賦值語句後面的執行.
1.4 預解析的影響
在執行代碼前會,預解析過程會在各自做用域中將執行全部聲明語句,這樣咱們就會以爲預解析將聲明語句進行了提高.
須要注意的是,聲明的變量仍是屬於各自的做用域,預解析的過程不存在改變變量的做用域.
1.5 詞法做用域
詞法做用域指的是從代碼的可讀區域到不可讀區域,造成的密閉的獨立的內存空間.
在每一個詞法做用域都會執行一遍新的詞法分析,語法分析,執行代碼三個JS引擎步驟,而且不影響其餘詞法做用域.
在JS中函數是一個密閉的獨立的內存空間,因此函數就是一個詞法做用域.