JavaScript預解析

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中函數是一個密閉的獨立的內存空間,因此函數就是一個詞法做用域.

相關文章
相關標籤/搜索