Web面接におけるJS事前解析と変数プロモーションの違い

Web面接におけるJS事前解析と変数プロモーションの違い

事前分析とは何ですか?

コンセプト:

JS コードが上から下まで実行される前に、ブラウザはまずすべての変数宣言を解析します。この段階は事前解析と呼ばれます。

詳しい説明

スコープ内で var および関数宣言を探し (匿名関数には関数宣言がないため、ホイストされません)、それらを事前に宣言し、代入操作をそのままにして、コードを上から下へ実行します。これは事前分析プロセスです。

変数と関数の準備の違い

事前解析中に、 varで宣言されたすべての変数とfunctionで宣言された関数がスコープの先頭に昇格されます。

varで宣言された変数は事前解析中にのみ事前に宣言され、代入ステートメントはそのまま残ります。

functionで宣言された関数は、事前解析時に事前に宣言および定義されます。関数が実行されると、関数内で事前解析が行われます。

注意: 匿名関数には関数宣言がないため、昇格されません。

var 変数の繰り返し宣言

var が繰り返し宣言された場合: すでに存在する場合、コンパイラはvar無視してコンパイルを続行します。

存在しない場合は、アプリケーション ドメイン チェーンに沿って上方向に検索します。

見つからない場合、変数はこのスコープ内で宣言されます。

変数と関数の昇格の優先順位

要約:

関数の昇格は変数の昇格よりも優先順位が高く、同じ名前の変数が宣言されたときには上書きされませんが、変数に値が割り当てられた後は上書きされます。

以下のコンテンツは以下から転載したものです:

https://blog.csdn.net/caoyafeicyf/article/details/53172532

関数の優先度が変数の優先度よりも高い理由を詳しく見る

ブラウザの事前解析プロセス

小さな質問から始めましょう。

var foo;
関数 foo(){}
コンソールにログ出力します。

結果は関数本体のfunction foo(){}になります。
次に次の質問です。

 function foo(){ }var foo;console.log(foo);

結果は関数本体でもある

関数 foo(){}

関数宣言の優先度は変数宣言の優先度よりも高いと言う人が多いです。

それで、なぜでしょうか?これはブラウザの事前解析から始まります。

事前分析プロセス

事前に解析されたキーワードを検索する

varキーワードを探す

関数キーワードを見つける

事前解析を実行する

まず、var キーワードを使用して識別子を宣言し、これらの識別子を定義します。識別子が定義された後は、この識別子を使用するときにエラーは報告されません。ただし、値が割り当てられていないため、その値は未定義です。

これまでのところ、識別子は関数への参照を保持しています。

注目すべきいくつかの詳細

  • 同じ識別子に対して var キーワードを繰り返し使用した場合、最初の使用以外はすべて無視されます。
  • 事前解析時には、変数宣言が最初に処理され、関数宣言が 2 番目に処理されます。
  • どちらが優先されるかを心配する必要はありません。これらは単なる表面的な現象です。
  • 事前分析プロセスを理解してください。すべては過ぎ去る雲に過ぎません

事前解析の原則を読んだ後、この記事の冒頭の 2 つの質問に戻り、事前解析プロセスを分析し、関数の優先度が変数の優先度よりも高い理由を詳しく理解しましょう。私に従ってください

まずは最初のものを見てみましょう

var foo;
関数 foo(){}
コンソールにログ出力します。

事前分析プロセスは次のとおりです。

var foo;<---- 変数宣言内のvar
var foo;<----関数宣言から抽出されたvar
foo = function () {} <----関数宣言の抽出された割り当て console.log(foo);

2番目を見てみましょう

関数 foo(){}
var foo;
コンソールにログ出力します。

事前分析プロセスは次のとおりです。

var foo;<---- 変数宣言内のvar
var foo;<----関数宣言から抽出されたvar
foo = function () {} <----関数宣言の抽出された割り当て console.log(foo)

2つを比べてみて、何に気づきましたか?事前解析プロセスは同じであることが判明しており、これが関数が変数よりも優先される理由です。

上記の内容を理解したら、次に別の質問があります。

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

ブラウザはどのように解析するのでしょうか?私の考えの流れを追ってみましょう:

1. パーサーは最初に var キーワードを検索し、最初の行でそれを見つけて先頭に抽出します。
2. パーサーは function キーワードを検索し、2 行目に見つけます。最初に var + 関数名を分離し、最初のステップと同じであることがわかったので、処理しません。次に、関数の割り当て、つまりa=function (){}分離を開始します。ここで、a は関数本体です。
3. 次にパーサーは変数割り当てa=1を処理し、前のステップの関数本体が上書きされ、この時点で a=1 になります。
4. 最後に、 console.log(a)を処理し、結果は当然 1 になります。

パーサーによって処理されるコード プロセスは次のとおりです。

var a;<---- 変数宣言内のvar
var a;<----関数宣言から抽出されたvar
a=function (){<----関数宣言は代入 a=1; を抽出します。
コンソールにログ出力します。

以上が、Web面接におけるJS事前解析と変数プロモーションの違いについての詳しい内容です。JS事前解析と変数プロモーションの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • JavaScript ドキュメント オブジェクト モデル DOM
  • JS の == と === の違いをご存知ですか?
  • JavaScript の未定義と null の相違例の分析
  • JavaScript es6 における var、let、const の違いの詳細な説明
  • JavaScript におけるホイスティングの詳細説明(変数ホイスティングと関数宣言ホイスティング)
  • JavaScript でローカル変数をグローバル変数に変換する方法
  • JavaScript クロージャの説明
  • JavaScriptコールバック関数の詳細な理解
  • Javascriptの基礎を学ぶための10の重要な質問

<<:  シェル スクリプトを使用してワンクリックで MySQL 5.7.29 をインストールする方法

>>:  Nginx ドメイン転送の使用シナリオ コード例

推薦する

Centos7 での MySQL 5.7.20 のインストールと設定に関する詳細なチュートリアル

1. 公式 Web サイトから MySQL 5.7 インストール パッケージ (mysql-5.7....

Node.js で簡単なクローラーケースを作成するチュートリアル

準備まず、nodejs をダウンロードする必要がありますが、これは問題ないはずです。原文はwebst...

異なるインデックスを更新してMySQLのデッドロックルーチンを解決する

前回の記事では、ソース コードを使用してロック関連の情報をデバッグする方法を紹介しました。ここでは、...

CentOS7.4 起動時の緊急モードへようこそメッセージに対する解決策

今日は仮想マシンを使って実験をしました。システムをインストールし、いくつかのオプションを最適化した後...

MySQL の同時実行性の問題と解決策の分析

目次1. 背景2. テーブルロックによるクエリの遅延3. オンラインでテーブル構造を変更するとどのよ...

Vue cli開発に基づく外部コンポーネントVantのデフォルトスタイルの変更の詳細な説明

目次序文1. 少ない2. コンポーネントをインポートする3. 設定ファイルを変更するステップ1: l...

中国語と英語のフォント名の比較表(FounderとArphicを含む)

CSS ファイルでは、フォント名が文字化けしていることがよくあります。これは、作成者が中国語フォン...

Docker実行コンテナが作成状態にある問題についての簡単な説明

最近の問題としては、次のような現象があります。システムには、docker run コマンドを継続的に...

テンプレートタグの使用方法の詳細な説明(Vue での使用方法の概要を含む)

目次1. HTML5のテンプレートタグ2. テンプレートタグ操作のプロパティとメソッド3. Vueの...

Centos7 での MySQL のインストールに関するチュートリアル

最近、自宅サーバーにクラウドディスクを導入する予定なので、一連の環境構築作業を始めました。MySQL...

webpackコード断片化の実装

目次背景コモンズチャンクプラグイン分割チャンク構成リソースを非同期に読み込む要約する背景高性能なアプ...

IDEA を使用して Web プロジェクトを作成し、Tomcat に公開する方法

目次ウェブ開発1. Web開発の概要Tomcatのインストールと設定Tomcatをインストールする2...

Vueは水平の斜めの棒グラフを実装します

この記事では、水平傾斜棒グラフを実装するためのVueの具体的なコードを参考までに共有します。具体的な...

Docker で複数の MySQL コンテナを作成して実行する方法の例

1. mysql/mysql-server:latestイメージを使用してMySQLインスタンスを素...

Bootstrap 3.0 の特殊効果の学習ノート(表示と非表示、フローティングの除去、閉じるボタンなど)

この記事の主な内容は次のとおりです。 1. 閉じるボタン2.キャレット3. フローティングを素早く設...