預編譯
js 執行
1.語法分析:檢查代碼以及語法是否有錯,若是報錯則不執行後面的代碼
2.預編譯:在內存中開闢一段空間,存儲變量和函數
3.解釋執行:執行代碼函數
預編譯的步驟
1.建立AO(Activation Object)
2.找到函數的形參和變量聲明,將變量和形參做爲AO的屬性名,復賦值undefined
3.將形參和實參統一,將實參的值給形參
4.尋找函數中的函數聲明,將函數名做爲AO的屬性名,值爲函數體
函數的聲明是(function fun(){} 不是var fun = function{})
函數做用域
例如:function fun(a, b) {
console.log(a)
console.log(b)spa
var a = 20;
var b = 30;
console.log(b)
console.log(a)對象
function a() {}
var a = function() {}
var b = function() {}
a = 50
// function b() {}
console.log(a)
console.log(b)
}
fun(10)
建立AO而且賦值undefined
AO:{
a : undefined
b : undefined
}
將實參賦值給形參
AO:{
a:10
b : undeined
}
尋找函數中函數聲明
AO :{
a : function a(){}
b : undeined
}
代碼執行
function fun(a, b) {
console.log(a) //AO對象的值爲 function a(){}
console.log(b) //undefined內存
var a = 20;
var b = 30;
console.log(b) // 30
console.log(a) // 20作用域
function a() {} 不執行
var a = function() {}
var b = function() {}
a = 50
console.log(a) // 50
console.log(b) 30
}
fun(10)io
全局做用域 1.建立GO對象
GO{
}console
2.找到全局中的變量聲明,將函數和形參名的做爲GO對象的屬性名,值爲undefined編譯
GO{
fun :undefined
} function
3.找到全局中函數聲明將函數做爲GO對象的屬性名,值爲函數
GO{
fun :function fun(){}
}變量
代碼執行結果爲function a(){}
做用域鏈
var num = 10
function f1(){
var num = 20
function f2(){
var num = 30
function f3(){
var num = 40
console.log(num)
}
f3()
}f2()
}
f1()
這個函數執行結果爲 40 若是沒有 var num = 40 ; 結果爲 30 若是沒有 var num = 30 ; 結果爲 20 若是沒有 var num = 20 ; 結果爲 10 若是沒有 var num = 10 ; 結果是報錯 函數在調用參數時會從函數內部到函數外部逐個」搜索「參數,一直找到參數爲止,若是沒有聲明就返回null,聲明瞭沒有賦值就返回undefined,就像沿着一條鏈子同樣去搜索,這就是做用域的鏈式調用。