JavaScriptのプリコンパイルを見てみましょう(概要)

JavaScriptのプリコンパイルを見てみましょう(概要)

JSランニング三部作

js実行コードは3つのステップに分かれています

  • 構文解析
  • プリコンパイル
  • 解釈

JavaScript コードが実行されると、最初に構文解析を実行してコード内に低レベルのエラーがあるかどうかを確認し、次にプリコンパイルして内部ロジックを整理し、最後にコードを 1 行ずつ実行し始めます。

構文解析

コードを実行する前に、システムはコード全体をスキャンして、中括弧の欠落などの低レベルの構文エラーがないか確認します。

プリコンパイル

コンパイル前の序章

プリコンパイルは関数が実行される直前に行われます。変数は宣言されずに値が割り当てられ、変数はグローバルオブジェクトによって所有されます。

a = 3

var b = c = 4

宣言されたすべてのグローバル変数はウィンドウのプロパティです

var a = 1 ===> window.a = 1

プリコンパイルの4つのステップ

  1. AO (アクティベーション オブジェクト) オブジェクトを作成します (関数内のローカル変数を保存します)
  2. パラメータと変数の宣言を見つけ、変数名とパラメータ名を未定義の値を持つAO属性名として使用します。
  3. 実パラメータと仮パラメータを統合する
  4. 関数本体内の関数宣言を探し、関数本体に値を割り当てます。

例を挙げて説明しましょう。また、先に進む前に自分で答えを出すこともできます。

関数fn(a) {
 コンソールにログ出力します。
 var a = 123;
 コンソールにログ出力します。
 関数a() {}
 コンソールにログ出力します。
 var b = function() {};
 コンソールログ(b);
 関数 d() {}
 コンソールログ(d)
}
関数(1)

最初のステップは、AO (アクティベーション オブジェクト) オブジェクトを作成することです。 2 番目のステップは、仮パラメータと変数宣言を見つけ、変数名と仮パラメータ名を undefined の値を持つ AO 属性名として使用することです。

{
 a: 未定義、
 b: 未定義、
}

3番目のステップは、実際のパラメータと形式パラメータを統合することです。

{
 a: 1、
 b: 未定義、
}

ステップ4: 関数宣言を見つけて関数本体に値を割り当てる

{
 a: 関数 a() {},
 b: 未定義、
 d: 関数 d() {}
}

したがって関数fnが実行される直前のa、b、dの値は上記のようになります。

したがって、fn(1)を実行した結果は

// ƒa() {}
// 123
// 123
// ƒ() {}
// ƒd() {}

グローバルスコープでは、プリコンパイルのプロセスが若干異なります。

  • GO (グローバルオブジェクト) オブジェクト (関数内にグローバル変数を格納する) を作成します GO === window
  • パラメータと変数の宣言を見つけ、変数名とパラメータ名を未定義の値を持つGO属性名として使用します。
  • 関数本体内の関数宣言を探し、関数本体に値を割り当てます。

解釈

コードを1行ずつ実行する

練習問題

ここにいくつかの例がありますので、興味があればご覧ください。

関数テスト(a, b) {
 コンソールにログ出力します。
 コンソールログ(b);
 var b = 234;
 コンソールログ(b);
 a = 123;
 コンソールにログ出力します。
 関数a() {}
 var a;
 234;
 var b = function() {};
 コンソールにログ出力します。
 コンソールログ(b);
}
テスト(1);
グローバル = 100;
関数fn() {
 console.log(グローバル);
 グローバル = 200;
 console.log(グローバル);
 var グローバル = 300;
}
関数fn();
var グローバル;

関数テスト() {
 コンソールログ(b);
 もし(a){
  var b = 100;
 }
 234;
 コンソールログ(c);
}
var a;
テスト();
a = 10;
コンソールログ(c);

要約する

ほとんどの場合、プリコンパイル プロセスを処理するために次の方法を使用します。

  • 関数の宣言、全体的な改善
  • 変数宣言、宣言の昇格

複雑な状況に遭遇した場合、問題を解決するには最も原始的な方法しか使えません。

JavaScript プリコンパイルの理解(まとめ)に関する記事はこれで終わりです。JavaScript プリコンパイルに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript のプリコンパイルと暗黙のグローバル変数の簡単な分析
  • JavaScript のプリコンパイル プロセスを説明する例
  • JavaScript プリコンパイル原理の詳細な説明
  • JavaScript実行プロセスの「プリコンパイルフェーズ」と「実行フェーズ」
  • JSPをプリコンパイルすることでパフォーマンスのボトルネックを解消

<<:  MySQLでヘッダー付きのCSVファイルをエクスポートする方法

>>:  Linux で crontab 出力リダイレクトが有効にならない問題の解決方法

推薦する

MySQL インデックスの最適化: ページング探索の詳細な紹介

目次MySQL インデックス最適化ページングの調査ケース1ケース2 MySQL インデックス最適化ペ...

Nginx がリクエストを処理する際のマッチングルールの詳細な分析

nginx はリクエストを受信すると、まず server_name でサーバーを照合し、次にサーバー...

node_modulesを削除して再インストールする方法

目次ステップ1: プロジェクトをインストールするディレクトリにnode_modulesをインストール...

HTML の POST リクエストにおける a タグの 2 つの使用法の分析

HTML POST リクエストで a タグを使用する 2 つの例を次に示します。 1. ajaxを使...

MySQL をデプロイするときに発生する「テーブル mysql.plugin が存在しません」という問題の解決方法

今日、MySQL の無料インストール版をデプロイしたところ、テーブル 'mysql.plug...

インターネット接続なしでLinux Centos7にアプリケーションをインストールする方法の詳細な説明

1. 前の章では、プログラムを yum リポジトリに直接インストールできることを学びましたが、そのた...

RGBカラーテーブルコレクション

RGBカラーテーブル色英語名RGB 16色雪255 250 250 #FFFAFAゴーストホワイト2...

Win10にnginxをインストールして設定するプロセス

1. はじめにNginx は、無料のオープンソースの高性能 HTTP サーバーおよびリバース プロキ...

MySQL ファジークエリステートメントコレクション

SQL ファジークエリステートメント一般的なファジーステートメントの構文は次のとおりです。 SELE...

弾力性のあるナビゲーション効果を実現するJavaScript

この記事では、弾性ナビゲーション効果を実現するためのJavaScriptの具体的なコードを参考までに...

HTML に CSS を導入するいくつかの方法の紹介

目次1. HTMLタグ要素にCSSスタイルを直接埋め込む2. HTMLのheadセクションにおけるス...

MySQL ストアド プロシージャの権限の問題の概要

MySQL ストアド プロシージャは、確かに、非常にまれな使用シナリオのように見えます。この問題は、...

CSSでできるならJavaScriptは使わない

序文JavaScript で記述できるアプリケーションは、最終的には JavaScript で記述さ...

Dockerコンテナでルート権限を取得する方法

まず、コンテナが稼働している必要がありますコンテナのCONTAINER IDは、sudo docke...

ウィンドウ環境設定Mysql 5.7.21 windowx64.zip無料インストール版チュートリアル詳細説明

1. 公式サイトのmysqlダウンロードページからmysql-5.7.21-windowx64.zi...