1. 程式人生 > >關於js預編譯、宣告提前的有趣現象

關於js預編譯、宣告提前的有趣現象

關於js,大家都知道js是一門單執行緒的解釋性語言,解釋性語言就是指一句一句執行的語言。

js在執行前會先預編譯下,簡單點說就是掃描js程式碼,對要宣告變數的宣告,提前的提前! 接下來就講一下預編譯的四部曲:

  1. 建立AO物件
  2. 找到形參和變數宣告,將變數和形參名作為AO屬性名,值為undefined
  3. 將實參值和形參統一(賦值)
  4. 在函式體裡面找函式宣告,值賦值函式體

從上面的步驟可以看出,函式宣告是最後的,相當於優先順序最高,現在來看看一些有趣的題目:

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(){}
		}

按照這樣的規律去分析的話,一些看起來嚇人的面試題也就能解決了