JavaScript詳細解プリコンパイルの原理


JavaScriptプリコンパイルの原理
今日はたくさんの時間を使って、スコープ、プリコンパイルなどの知識を復習しました。
たくさんのブログを読んで、前に読んだ本を開いてみました。
最初は自分がよく勉強していると思いましたが、実はまだいくつかの思考の誤りがあります。
今晩は乱れた考えを整理しました。
あらかじめコンパイルした知識を整理しておきましょう。後で時間があれば、スコープを詳しく説明してください。
皆さんはこのプリコンパイルと伝統的なコンパイルは違っていることを理解してください。
JavaScriptは解釈型言語であり、
説明言語である以上、コンパイル行で、行を実行します。
従来のコンパイルは多くのステップを経て、分詞、解析、コードの生成などがあります。
後で時間があったら、またみんなにコープをあげます。
以下は私が理解しているJSのプリコンパイルを共有します。
JavaScriptは三部作を実行します。
脚本のjsエンジンは何をしましたか?
  • 文法解析
  • プリコンパイル
  • 解釈実行
  • コードを実行する前に、まだ二つのステップがあります。
    文法の分析は簡単です。つまり、エンジンでコードを確認します。
    説明実行は文字通り実行コードです。
    プリコンパイルは簡単に理解できます。メモリの中にいくつかの空間を開いて、いくつかの変数と関数を保存します。
    プリコンパイルが皆さんの役割領域を理解するのにも役に立ちます。
    JSプリコンパイルはいつ発生しますか?
    私も初めは思考が間違っていました。ここで発生しました。
    プリコンパイルはいつ発生しますか?
    上の過程で誤解を生じないようにお願いします。
    プリコンパイルはscript内のコードブロックが実行される前にのみ発生すると勘違いしました。
    これは悪くないです
    プリコンパイルは確かにscriptコード内で実行前に発生しました。
    しかし、ほとんどは関数実行前に発生します。
    JSプリコンパイルの例
    例を挙げる前に、まずこれらの概念を考えてみましょう。
  • 変数宣言var...
  • 関数宣言function…
  • 
    <script>
      var a = 1;//     
      function b(y){//    
        var x = 1;
        console.log('so easy');
      };
      var c = function(){//            !!
        //...
      }
      b(100);
    </script>
    <script>
      var d = 0;
    </script>
    
    エンジンがこのコードに対して何をしているか見てみましょう。
    1.ページができたらGOグローバルオブジェクト(Global Object)を作成しました。
    2.最初のスクリプトファイルの読み込み
    3.スクリプトの読み込みが完了したら、文法が適法かどうかを分析します。
    4.プリコンパイルを開始する
    変数宣言を検索して、GO属性として、値がundefinedに与えられます。
    検索関数宣言は、GO属性として関数体に値を与えます。
    
    //   
    GO/window = {
      //      GO  ,   document、navigator、screen    ,    
      a: undefined,
      c: undefined,
      b: function(y){
        var x = 1;
        console.log('so easy');
      }
    }
    
    実行コードを説明します。実行関数bまで。
    
    //   
    GO/window = {
      //            
      a: 1,
      c: function(){
        //...
      },
      b: function(y){
        var x = 1;
        console.log('so easy');
      }
    }
    
    関数bを実行する前にプリコンパイルが発生します。
  • AO活動対象(Active Object)を作成します。
  • モダリティおよび変数宣言を検索し、値はundefined
  • に与えられる。
  • 实参値は、形参
  • に与えられる。
  • は関数宣言を検索して、値は関数体に与えます。
  • 
    //   
    AO = {
      //  AO  ,   arguments    ,    
      y: 100,
      x: undefined
    }
    
    実行関数のコードを説明します。
    最初のスクリプトファイルの実行が完了しました。二つ目のスクリプトファイルをロードします。
    二つ目のスクリプトファイルの読み込みが完了したら、文法分析を行います。
    構文解析が完了しました。プリコンパイルを開始します。
    最初のプリコンパイル手順を繰り返します。
    皆さん、気をつけてください
    プリコンパイル段階では変数宣言と関数宣言が発生し、初期化されていません。匿名関数はプリコンパイルに参加しません。
    解釈実行時のみ変数初期化が行われます。
    えっと、最後に終わります。
    締め括りをつける
    プリコンパイル(関数実行前)※
    1.AOオブジェクトを作成する(Active Object)
    2.検索関数のイメージおよび関数内の変数宣言、イメージ名および変数名はAOオブジェクトの属性として、値はundefinedです。
    3.実参型は統一され、実参価は形参に与えられます。
    4.関数宣言を検索します。関数名はAOオブジェクトの属性として、値は関数参照です。
    プリコンパイル(スクリプトコードブロックscript実行前)
    1.グローバル変数宣言(暗黙的大域変数宣言を含み、var宣言を省略)を検索し、変数名作の大域オブジェクトの属性は、undefinedとします。
    3.関数宣言を検索して、関数名をグローバルオブジェクトの属性として、値を関数参照とします。
    プリコンパイルを理解することは、アップグレード挙動、this指向、作用ドメインおよび性能などの問題を理解する上で大きな助けとなります。
    読んでくれてありがとうございます。みなさんのご協力をお願いします。ありがとうございます。