JavaScript学習ノート——プリコンパイル


一般的にプリコンパイルは、関数宣言全体の昇格と変数宣言の昇格を簡単に要約されます.
関数の定義の回顧
まず関数のよく使われる二つの定義方法を振り返ってみます.
  • 関数宣言
  • function test() {
         
    	...
    }
    
  • 関数式
  • var test = function() {
         
    	...
    };
    
    関数プリコンパイル4部作
    関数プリコンパイルは、関数実行の直前に発生します.
  • AOオブジェクトActivation Objectを作成します.
  • モダリティおよび変数宣言を探して、モダリティおよび変数宣言をAOオブジェクト属性名として、値はundefined
  • です.
  • は、実参加の値を形参
  • に割り当てる.
  • は、関数体に関数宣言を見つけました.属性名は関数名で、属性値は関数体
  • です.
    実例
    function test(a, b) {
         
              console.log(a);
              console.log(b);
              c = 0;
              var c;
              a = 3;
              b = 2;
              function b(){
         }
              function d(){
         }
              console.log(b);
       }
    test(1);
    
    四部作に基づいて分析する.
    1.  AO  
    AO {
          
     }
    2.AO     ,  undefined
    AO {
         
    	a: undefined,
    	b: undefined,
    	c: undefined
    }
    3.         
    AO {
         
    	a: 1,
    	b: undefined,
    	c: undefined
    }
    4.           ,       ,       
    AO {
         
    	a: 1,
    	b: function b() {
         },
    	c: undefined,
    	d: function d() {
         }
    }
    
    続いて、文を順番に実行します.
    function test(a, b) {
         
              console.log(a); //1
              console.log(b); //function b
              c = 0;
              a = 3;
              b = 2;
              console.log(b); //2
       }
    test(1);
    
    グローバルプリコンパイル
    大域プリコンパイルは関数プリコンパイルとあまり違いません.グローバル実行前に発生しました.
  • GOオブジェクトを作成する:実行期間コンテキスト(Global Object)
  • 変数宣言を探して、属性としてGOオブジェクトに入れます.値はundefined
  • です.
  • 関数宣言を探します.値は関数
  • に与えられます.
    実例
    console.log(test);
    function test(test) {
         
    	console.log(test);
    	var test = 234;
    	console.log(test);
    	function test () {
         	
    	}
    }
    test(1);
    var test = 123;
    
    グローバルプリコンパイルを開始する前に
    1.   GO  
    GO {
         
    }
    2.GO   ,  undefined
    GO {
         
    	test: undefined、
    }
    3.GO {
         
    	test: function test(test) {
         
    			...
    		}
    }
    
    実行ステートメント
    console.log(test);// function test(test) {...}
    function test(test) {
         
    	console.log(test);
    	var test = 234;
    	console.log(test);
    	function test () {
         	
    	}
    }
    test(1);
    test = 123;
    
    関数を実行する前に関数のプリコンパイルを行います.
    1.  AO  
    AO {
          
     }
    2.AO     ,  undefined
    AO {
         
    	test: undefined
    }
    3.         
    AO {
         
    	test: 1
    }
    4.           ,       ,       
    AO {
         
    	test: function test () {
         }
    }
    
    実行関数
    function test(test) {
         
    	console.log(test); // function test () {}
    	test = 234;
    	console.log(test); // 234
    	function test () {
         	
    	}
    }
    
    二つの面接問題
    面接問題1
    function bar() {
         
    	return foo;
    	foo = 10;
    	function foo() {
         
    		
    	}
    	var foo = 11;
    }
    console.log(bar());
    
    分析
    //GO {
         
    //	bar : function bar() {},
    //}
    function bar() {
         
    	return foo;
    	foo = 10;
    	function foo() {
         
    		
    	}
    	var foo = 11;
    }
    //AO {
         
    //	foo: undefined => function foo() {},
    //}
    console.log(bar());//function foo() {}
    
    
    面接問題2
    console.log(bar());
    function bar() {
         
    	foo = 10;
    	function foo() {
         
    		
    	}
    	var foo = 11;
    	return foo;
    }
    
    分析
    //GO {
         
    //	bar: function bar() {},
    //}
    //AO {
         
    //	foo: undefined => function foo(){} => 10 => 11
    //}
    console.log(bar()); //11
    function bar() {
         
    	foo = 10;
    	function foo() {
         
    		
    	}
    	var foo = 11;
    	return foo;
    }