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 ドメイン転送の使用シナリオ コード例

推薦する

初心者のためのWebサイト構築入門 ③ エイリアス(CNAME)レコードとURL転送

①. エイリアス(CNAME)レコードの使用方法:前回の投稿のドメイン名解決では、A レコードの解...

Dockerはローカルイメージとコンテナの保存場所を設定します

指定したサイズより大きいファイルを検索するには、find コマンドを使用します。 検索 / -typ...

Vueでシングルサインオンを実装する方法のまとめ

最近プロジェクトが中断され、RageFrame の研究は一時的に終了しました。この記事では、シングル...

JavaScript プロトタイプの詳細

目次1. 概要1.1 プロトタイプとは何ですか? 1.2 プロトタイプを入手する2. プロトタイプの...

RedisとMemcacheの比較と選び方

最近 redis を使っていて、とても便利だと感じているのですが、インメモリ データベースを選択する...

MySQL リンクを表示し、異常なリンクを削除する方法

序文:データベースの運用や保守の際には、リンクの総数がいくつあるか、アクティブなリンクがいくつあるか...

MySQLクエリ最適化に必須の知識ポイントのまとめ

序文クエリの最適化は一夜にして達成できるものではありません。対応するツールの使い方を学び、他の人の経...

JavaScriptはフォームデータの非同期送信を実装します

この記事では、フォームデータの非同期送信を実装するためのJavaScriptの具体的なコードを参考ま...

css3 flexレイアウト justify-content:space-between 最後の行は左揃えになります

justify-content:space-betweenレイアウトを使用する場合、要素の最後の行に...

無視されたDOCTYPE記述の分析

doctype もその 1 つです。 <!DOCTYPE HTML PUBLIC "...

Chrome デベロッパー ツールの詳細な紹介 - タイムライン

1. 概要ユーザーは、アクセスする Web アプリケーションがインタラクティブでスムーズに実行される...

mysql の認証、起動、およびサービスの起動のための一般的なコマンド

1. 4つの起動方法: 1.mysqld MySQL サーバーを起動します: ./mysqld --...

HTML マークアップ言語 - リファレンス

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

CSS で水平方向と垂直方向に中央揃えする 10 の方法を教えます (要約)

面接には必需品、仕事でも必ず使います。うーん、誰でも分かるでしょう。これ以上何も言わずに、要約とレン...

JavaScript 文字列操作の 4 つの実用的なヒント

目次序文1. 文字列を分割する2. JSONのフォーマットと解析3. 複数行の文字列と埋め込み式4....