javascriptのプリコンパイル

801 ワード



	
		
	
	
		
			function fn(a){
				console.log(a);
				
				var a = 123;
				
				console.log(a);
				
				function a (){}
				console.log(a);
				
				var b = function(){}
				
				console.log(b);
				
				function d(){}
			}
			
			fn(1);
		
	
以上のコードの出力結果は、過過ぎるa(){} 
                                   123 
                                   123
                                   すぎる(){}
  これは関数が実行される前の時点で、プリコンパイルのプロセスがあり、4ステップに分けられているからです.
1、AOオブジェクトを作成する、すなわち関数実行コンテキスト
2、形参と変数宣言を探して、変数と形参名をAO属性名として、値はundefinedです.
3、実務値とイメージを統一する
4、関数体の中で関数声明を探して、値は関数体に与えます.
fn(1)実行前の時点でAOオブジェクトの値は{a:function a()です.    , b:undefined,d:function d(){}ですので、1文目の出力aの値を実行するときはfunction a(){}です.