前言:
js是解釋性語言夺荒,運行時才能解析出代碼對錯。
為什么可以變量函數提升良蒸?
js代碼是自上而下執(zhí)行技扼,但是在js代碼執(zhí)行前,會先進行詞法分析嫩痰。在詞法分析時剿吻,將變量和函數進行了提升。
js執(zhí)行兩個階段:
- 1.詞法分析
- 2.執(zhí)行
詞法分析三步驟
1串纺、分析參數
2丽旅、再分析變量的聲明
3、分析函數聲明
舉例
1 function fn(a){
2 var a = 1;
3 function a(){
4 console.log("a函數")
5 }
6 alert(a)
7 }
8 fn(2)
實際實現代碼:
1 function fn(a){
2 var a = undefined;
3 a = 2;
4 a = function a(){
5 console.log("a函數")
6 }
7 a = 1;
8 alert(a); // 1
9 }
10 fn(2)
具體分析:
詞法分析三步:
函數在運行的瞬間纺棺,生成一個活動對象(Active Object)榄笙,簡稱AO
第一步,分析函數參數:
形式參數:AO.a = undefined
實參:AO.a = 2
第二步祷蝌,變量聲明:
僅做一件事茅撞,沒有var a的話,就var a;
第三步巨朦,函數聲明:
有函數a米丘,AO.a = function a() {}
運行期:
將a賦值內部變量,即a=1;
不理解的可以私信糊啡。