關於js預編譯、宣告提前的有趣現象
阿新 • • 發佈:2018-12-15
關於js,大家都知道js是一門單執行緒的解釋性語言,解釋性語言就是指一句一句執行的語言。
js在執行前會先預編譯下,簡單點說就是掃描js程式碼,對要宣告變數的宣告,提前的提前! 接下來就講一下預編譯的四部曲:
- 建立AO物件
- 找到形參和變數宣告,將變數和形參名作為AO屬性名,值為undefined
- 將實參值和形參統一(賦值)
- 在函式體裡面找函式宣告,值賦值函式體
從上面的步驟可以看出,函式宣告是最後的,相當於優先順序最高,現在來看看一些有趣的題目:
cosole.log(a); //undefined var a; function test(a){ console.log(a);//function a(){} var a=123; console.log(a);//123 function a(){} console.log(a);//123 } test(1);
預編譯的四部曲分析一下:
AO(全域性):{
a:undefined,
test:undefined
}
AO(區域性/函式內) {
a:undefined-->1-->function a(){}
}
按照這樣的規律去分析的話,一些看起來嚇人的面試題也就能解決了