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 出力リダイレクトが有効にならない問題の解決方法

推薦する

シンプルなドラッグ効果を実現するjs

この記事では、簡単なドラッグ効果を実現するためのjsの具体的なコードを参考までに共有します。具体的な...

k8sとDockerの関係についての簡単な説明

最近、プロジェクトでは kubernetes (以下、k8s と表記、k と s の間には 8 つの...

Vue 仮想リストの実例

目次序文デザイン成し遂げるまとめ序文最近は、いつも延々とスワイプしています。 Weibo をチェック...

JavaScript BOM の説明

目次1. BOMの紹介1. JavaScriptは3つの部分から構成される2.ウィンドウオブジェクト...

ワンクリックで雨や雪のエフェクトを実現する ThingJS パーティクルエフェクト

目次1. パーティクルエフェクト2. シーンを読み込む3. さまざまな粒子効果の実現エンディング: ...

Linuxコマンドunzipの詳しい説明

目次1. 解凍コマンド1.1 構文1.2 オプション2. 例1. 解凍コマンドunzip コマンドは...

MySQL レプリケーション メカニズムの原理の説明

背景レプリケーションはデータの完全なコピーです。レプリケーションが必要な理由として、まず思い浮かぶの...

MySQLでカンマ区切り値の列を列に変換する方法

序文場合によっては、第 1 正規形設計パターンに従わないビジネス テーブルに遭遇することがあります。...

MySQL における一般的な高度な SQL ステートメント

MySQL 高度な SQL ステートメント kgc を使用します。 テーブルlocation(Reg...

openlayers6 マップオーバーレイの一般的な 3 つの用途 (ポップアップウィンドウマーカーテキスト)

目次1. 前に書く2. ポップアップウィンドウを実装するためのオーバーレイ2.1 vueページのad...

MySQL インデックスの失敗を引き起こす一般的な書き込み方法の概要

序文最近、古いプロジェクトから残ったいくつかの SQL 最適化の問題に対処するのに忙しくしています。...

MAC での MYSQL5.7.17 接続失敗の問題と解決策

MYSQL5.7.17 が MAC で接続できない問題。SQLBench_community 6.3...

MySQLの分離レベルとロックメカニズムの詳細な説明

目次簡単な説明: 1. 取引の4つの特徴2. 複数の同時トランザクションによって発生する問題3. ト...

Vuexの補助関数の使い方

目次マップ状態マップゲッターマップミューテーションマップアクション複数のモジュールマップ状態 ...