在咱們寫了不少關於業務邏輯的代碼後、過程當中會遇到不少關於變量定義、變量提高、做用域的問題,理解完預編譯就清晰不少javascript
引擎檢查你的代碼有沒有什麼低級的語法錯誤java
預編譯簡單理解就是在內存中開闢一些空間,存放一些變量與函數面試
解釋執行顧名思義即是執行代碼了bash
發生在script內代碼塊執行前、也能夠說預編譯發生在函數執行的前一刻函數
對於這樣一段代碼,常常在不少面試中會看到測試
let a = 0
function test(a,b){
console.log(a)
console.log(b)
a = 1
console.log(a)
console.log(c)
function c(){}
function a(){}
console.log(a)
}
test(1)
複製代碼
請問這段代碼的輸出是? 對於這樣的函數預編譯,咱們能夠記住預編譯的4個步驟ui
聽起來有點生澀難懂,可是咱們一行一行跟着這四個步驟一塊兒作的時候就明朗了spa
開始解題code
AO{
}
複製代碼
AO{
a : undefined,
b : undefined
}
複製代碼
AO{
a : 1,
b : undefined
}
複製代碼
知足 function a(){}這樣的叫函數聲明 而相似於let a = function(){} 這樣的並非函數聲明
複製代碼
咱們找到了a、c函數聲明,咱們須要去改寫AO對象中對應的屬性名,因爲c這個屬性名並不存在,咱們要建立並用函數賦值,所以咱們獲得了這樣一個對象對象
AO{
a : function(){},
b : undefined,
c : function(){}
}
複製代碼
而且在函數的解釋執行階段並不會對對應AO對象的屬性名進行值的改寫
至此,預編譯階段結束,進行到函數的解釋執行階段
let a = 0
/**
* 測試函數
* @param {*} a
* @param {*} b
*
*
*
* 咱們在預編譯結束的時候獲得這樣一個對象
* {
* a:function(){},
* b:undefined,
* c:function(){}
* }
*/
function test(a,b){
console.log(a)
console.log(b)
a = 1
console.log(a)
console.log(c)
function c(){}
function a(){}
console.log(a)
}
test(1)
複製代碼
下面咱們會逐字逐句解釋打印的值
{
a : 1,
b : undefined,
c : function(){}
}
複製代碼
至此、這個實例解釋完畢
若是從全局出發,則是建立一個GO對象,顧名思義Global Object,其四個步驟和函數內的預編譯四個步驟同樣