ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScriptのプリコンパイルは何をするのでしょうか?

JavaScriptのプリコンパイルは何をするのでしょうか?

醉折花枝作酒筹
リリース: 2023-01-07 11:44:58
オリジナル
2031 人が閲覧しました

Javascript のプリコンパイルは次のことを行います: 1. 構文分析。コードに低レベルの構文エラーがあるかどうかエンジンがチェックします。2. プリコンパイル。簡単に理解すると、メモリといくつかの変数と関数の保存; 3. 解釈と実行は、名前が示すように、コードを実行することです。

JavaScriptのプリコンパイルは何をするのでしょうか?

このチュートリアルの動作環境: Windows7 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。

JavaScript 実行トリロジー

  • 構文分析

  • プリコンパイル

  • ##解釈と実行

文法分析は非常に単純です。つまり、エンジンはコードに低レベルの構文エラーがあるかどうかをチェックします。解釈と実行は、その名前が示すように、実行することです。コード; プリコンパイルは単にメモリ内にあるものとして理解されます 変数や関数を保存するためにその中にスペースを作成します;

JS のプリコンパイルはいつ行われますか?

プリコンパイルはいつ行われますか?プリコンパイルはスクリプト内のコード ブロックが実行される前にのみ行われると誤解されています。プリコンパイルに問題はありません。プリコンパイルはスクリプト コードの実行前に行われますが、ほとんどは関数の実行前に行われます。

分析例

まず、次の 2 つの概念を区別して理解しましょう: 変数宣言 var... 関数宣言 function(){}

<script>
var a = 1;
console.log(a);
function test(a) {
  console.log(a);
  var a = 123;
  console.log(a);
  function a() {}
  console.log(a);
  var b = function() {}
  console.log(b);
  function d() {}
}
var c = function (){
console.log("I at C function");
}
console.log(c);
test(2);
</script>
ログイン後にコピー

分析プロセスは次のとおりです:

  • ページが生成されると、GO グローバル オブジェクト (グローバル オブジェクト) (つまり、ウィンドウ オブジェクト);

  • 最初のスクリプト ファイルが読み込まれます。スクリプトがロードされ、構文が正当かどうかを分析します。

  • 変数宣言を見つけるためにプリコンパイルを開始します。GO 属性として、値は未定義に割り当てられます。

  • 関数宣言を検索し、GO 属性として値が関数本体に割り当てられます;

プリコンパイル済み

//抽象描述
    GO/window = {
        a: undefined,
        c: undefined,
        test: function(a) {
            console.log(a);
            var a = 123;
            console.log(a);
            function a() {}
            console.log(a);
            var b = function() {}
            console.log(b);
            function d() {}
        }
    }
ログイン後にコピー

実行コードの説明(関数 test(2) を呼び出すステートメントが実行されるまで)

//抽象描述
    GO/window = {
        a: 1,
        c: function (){
            console.log("I at C function");
        }
        test: function(a) {
            console.log(a);
            var a = 123;
            console.log(a);
            function a() {}
            console.log(a);
            var b = function() {}
            console.log(b);
            function d() {}
        }
    }
ログイン後にコピー

関数 test() を実行する前にプリコンパイルが発生します

    #Create AO Active Object;
  • 仮パラメータと変数宣言を検索し、その値を未定義に代入します;
  • 実際のパラメータ値を仮パラメータに代入します;
  • 関数宣言を見つけて関数本体に値を割り当てます。
  • ##プリコンパイル前の 2 つの小さなステップ 1 と 2 は次のとおりです。 #
    //抽象描述
        AO = {
            a:undefined,
            b:undefined,
        }
    ログイン後にコピー
  • プリコンパイルの 3 番目のステップは次のとおりです:
//抽象描述
        AO = {
            a:2,
            b:undefined,
        }
ログイン後にコピー

プリコンパイルの 4 番目のステップは次のとおりです:

//抽象描述
    AO = {
        a:function a() {},
        b:undefined
        d:function d() {}
    }
ログイン後にコピー

テストを実行すると、次のプロセスが変更されます( ) 関数:

//抽象描述
    AO = {
        a:function a() {},
        b:undefined
        d:function d() {}
    }
    --->
    AO = {
        a:123,
        b:undefined
        d:function d() {}
    }
    --->
    AO = {
        a:123,
        b:function() {}
        d:function d() {}
    }
ログイン後にコピー

実行結果:

注:

JavaScriptのプリコンパイルは何をするのでしょうか?変数宣言と関数宣言はプリコンパイル段階で発生します。初期化動作 (代入) はなく、匿名関数はプリコンパイルに参加しません。変数のみが解釈および実行フェーズ中にのみ初期化されます。

#プレコンパイル (関数実行前)

AO オブジェクト (アクティブ オブジェクト) の作成

  • 関数内の関数仮パラメータと変数宣言を検索します。仮パラメータ名と変数名は、関数の属性として使用されます。 AO オブジェクト、値は未定義です。

  • 実パラメータと仮パラメータは統一され、実パラメータは統一されます。仮パラメータに値を代入します。

  • 関数宣言を探します。関数名は AO オブジェクトの属性として使用され、値は関数参照です。

  • プリコンパイル済み (スクリプト コード ブロックの前)スクリプトが実行されます)

グローバル変数宣言 (var 宣言を省略した暗黙的なグローバル変数宣言を含む) を探します。変数名はグローバル オブジェクトのプロパティであり、値は未定義です

  • 関数宣言を検索します。関数名はグローバル オブジェクトの属性として使用され、値は関数参照です。

  • Pre-コンパイルの概要

プリコンパイル 2 つの小さなルールをコンパイルします

  • 関数宣言の全体的な改善 - (具体的には、関数呼び出しと宣言の位置が前または後である場合、システムは常に関数宣言を呼び出しの前に移動します)

    • 変数宣言の昇格 - (具体的には、変数呼び出しと宣言の位置が前または後である場合、システムは常に宣言を呼び出しの前に移動します。宣言のみであるため、値は未定義であることに注意してください)

    • プリコンパイルされたプレリュード
  • 暗黙的にグローバル、つまり任意の変数を宣言せずに割り当てた場合、この変数はグローバル変数によって所有されます。 (グローバル ドメインは Window です)

    • #宣言されたすべてのグローバル変数はウィンドウのプロパティです; var a = 12; は Window.a = 12;
    • と同等です

    • 関数のプリコンパイルは、関数の実行直前に行われます。

[推奨学習:
    JavaScript 上級チュートリアル
  • ]

以上がJavaScriptのプリコンパイルは何をするのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート