浅談jsプリコンパイル


JSの二つの特徴
1,単一スレッド言語,単一スレッドとは何か,つまりJSは同一時間に1つのことしかできないということであり,HTML 5でJSが複数のスレッドを作成できると提案されているとしても,メインスレッドによって制御され,DOMを操作することはできない.だから本質的には、JSは単一スレッド言語です.2、解釈言語、すなわち翻訳は一言実行しますが、本当に直接的ではありません.
     console.log(a) // undefined
     console.log(b) //   
     var a = 10;

私たちはaがundefinedでbが直接間違っていることを発見しました.ここからJSは単純な意味での翻訳ではなく、1つの文を実行しているのを見ることができます.そうしないと、aは直接間違っているはずです.次のは実行しません.実はJS実行は3ステップに分かれています.
1、文法分析全編スキャンで低級な間違いがあるかどうか(括弧を少なく書いたり、中国語の句読点を書いたりしない).
2、プリコンパイル
3,解釈実行解釈1行1行実行.
ここで理解するのは、プリコンパイルの一環であり、プリコンパイルを理解するには、まずglobal(グローバル変数)という単語を知る必要があります.1,すべての宣言されていない割り当ては、グローバルオブジェクト(window)のすべてです.
    function text(){
     
       b = 10;
    }
    text();
    console.log(window.b) // 10

2.グローバル範囲で宣言されるグローバル変数はすべてグローバル属性です.
    var a = 12;
    console.log(window.a) // 12

まず、プリコンパイルの手順を見てみましょう.プリコンパイルは関数プリコンパイルとグローバルプリコンパイルに分けられます.まず関数を見てみましょう.それから、グローバルプリコンパイルは簡単です.関数プリコンパイル4部作:
  • AOオブジェクトActivation Objectを作成する.(実行期間コンテキスト);
  • 形パラメータと変数宣言を探し、変数と形パラメータ名をAOの属性名とし、値はundefinedである.
  • 実パラメータ値とパラメータを統一する.
  • 関数体の中で関数宣言を探して、値はその関数体です.

  • 直接書いてもよくわからないのでJS問題で検証できます
       function fn(a){
         
               console.log(a); 
    
               var a = 123;
    
               console.log(a);  
    
               function a(){
         };
    
               console.log(a)  
    
               console.log(b) 
    
               var b = function (){
         }
    
               console.log(b); 
               
               function d(){
         }
            }
            fn(1);
    

    この問題を見たらまず慌てないで、手順に従って一歩一歩来てください.1,AOオブジェクトActivation Object(実行期間コンテキスト)の作成
      AO{
          }
    

    2,形のパラメトリックと変数の宣言を探して、変数と形のパラメトリック名をAOの属性名として、値はundefinedです;上から下へのプローブパラメータと変数宣言は、undefinedを割り当て、同名の下の上書きに遭遇します.
          AO{
         
                a : undefined,
                b : undefined,
                d :  undefined
            }
    
  • 実パラメータ値とパラメータを統一する.aの実パラメータは1
  • であることが分かった.
          AO{
         
                a : 1,
                b : undefined,
                d :  undefined
            }
    
  • 関数体の中で関数宣言を探して、値はその関数体です.aとdは関数宣言であり、彼らに関数体を付与し、bは関数式であるため、このステップは行わない.
  •      AO{
         
               a : function a(){
         },
               b : undefined,
               d :   function d(){
         }
           }
    

    これでプリコンパイルが完了し、プリコンパイルは関数の実行の直前になるので、プリコンパイルが完了すると、関数が実行されます.
       function fn(a){
         
               console.log(a);  //function a (){}       a     a    AO   ,  a    ,       
    
               var a = 123;
    
               console.log(a);  // 123                b       ,       123,  a  123
    
               function a(){
         }
    
               console.log(a);  // 123                 a   ,             
    
               console.log(b) ; // undefined       AO  b   undefined
    
               var b = function (){
         }
    
               console.log(b); // function(){}                       b       ,               , b     。
               function d(){
         }
    
            }
            fn(1)
    

    基本関数のプリコンパイルはこのように悪くなく、もう一つは関数が自分のAOオブジェクトで変数が見つからないとき、グローバルオブジェクトGOすなわちwindowで探し、見つからないとエラーを報告することです.
    グローバルプリコンパイル三部作
  • GOオブジェクトの作成:実行期間コンテキスト(Global Object)GO==window
  • 変数宣言を探し、属性としてGOオブジェクトに配置し、値はundefined
  • である.
  • 関数宣言を探し、値は関数体
  • に与えられる.
       console.log(a) // undefined      GO{a;undefined,text:function text () {}   }  a   undefined
       function text(){
         }
       console.log(b) //   
       var a = 10;
    

    グローバルなプリコンパイルは関数と同様に、パラメータがないため、より簡単に見えますが、私はあまり説明しません.
    それからこれは主に多く覚えて多く問題をして、熟練してマスターすることができます.私はここでいくつかの問題を書いているので,みんなは自分で見てもいいです.
        function test(a, b) {
         
                console.log(a);
                console.log(b);
                var b = 234;
                console.log(b);
                a = 123;
                console.log(a);
                function a() {
          }
                var a;
                b = 234;
                var b = function () {
          }
                console.log(a);
                console.log(b);
            }
            text(1)
    
      console.log(test);
            function test() {
         
                console.log(test);
                var test = 234;
                console.log(test);
                function test() {
          }
            }
            test(1)
    
     	    global = 100;
            function fn() {
         
                console.log(global);
                global = 200;
                console.log(global);
                var global = 300;
            }
            fn();
    

    入社して間もない小先端はこれから自分の技術共有の旅を始め、アドバイスと批判を歓迎します.