JavaScriptプリコンパイル詳細

1412 ワード

JSの運行は三つの部分に分けられます.文法分析➡️プリコンパイル➡️解釈の実行
文法分析:JSエンジンはまず全編スキャンして、低級な文法エラーがあるかどうかを確認します.
(関数)事前コンパイルの詳細:
まず、このコードの出力状況を見てみます.
    console.log(a);                 //   undefined
    var a = 5;
エラーは発生していませんが、aの値も出力されていません.これは、事前通訳が変数の声明を論理の先頭に上げるからです.つまり、var a=5をvar aに分割することです.a=123;そしてvar aを一番前に上げます.同じように、プリコンパイルも関数宣言を全体的に向上させます.次のコードは間違いないです.
test()
function test(){
    console.log('   ')
}
この気持ち悪いコードがあったらね.
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);
so EZ!前コンパイルの4部作だけを理解してください.1.AO(Activation Object)オブジェクトを作成します.(実行期間の文脈は作用領域です.2.形参と変数宣言を見つけて、AOオブジェクトの属性名として値をundefinedとします.3.実参加型参相を統一します.4.関数体内で関数宣言を見つけて、値をAOオブジェクトに割り当てます.
この四部を使って上記のコードを分析します.第一歩はAOを作成します.
}第二ステップ:AO{a:undefined、b:undefined}第三ステップ:AO{a:1;b:undefined第四ステップ:AO{a:function a(){b:undefined、d:function d{}}を説明してから実行を開始します.出力function a(){}実行a=123;第二のconsolie.log(a);出力123 function a(){}プリコンパイルを見たら、第三のconsolie.log(a);出力123は、b=function(){}第4のconsolie.log(b);出力function(){}
(大域)大域をプリコンパイルしたプリコンパイルは3ステップ1に分けられます.GO(Global Object)オブジェクト(windowはGO)2を生成します.イメージと変数宣言を見つけて、GOの対象となる属性名をundedinedとします.3.関数宣言を見つけて、GOの対象に値を与えます.
これはプリコンパイルの全過程を理解してからとても簡単になります.