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 での Mysql5.7.19 の詳細なインストールチュートリアル

1. ダウンロード公式サイトからmysql-5.7.19-linux-glibc2.12-x86_6...

HTMLのタグと要素の違いの詳細な説明

ウェブページに慣れていない友人の多くは私と同じように、HTML で要素、タグ、属性がどのように定義さ...

モバイルデバイスにおける適応レイアウトの問題に関する簡単な説明 (レスポンシブ、rem/em、Js ダイナミクス)

3G の普及により、携帯電話を使ってインターネットにアクセスする人が増えています。モバイル デバイ...

Linux 圧縮ファイルコマンド zip の使用例

「.zip」形式は、Windows システムでファイルを圧縮するために使用されます。実際、「.zip...

MySQLの自動増分主キーの実装の詳細な説明

目次1. 自己増分値はどこに保存されますか? 2. 自己価値修正メカニズム3. 自動増分値を変更する...

JavaScript の for/of、for/in の詳細な紹介

目次JavaScriptでは、 forループを記述する一般的な方法がいくつかあります。最初の、そして...

Vue における nextTick の役割といくつかの簡単な使用シナリオ

目的nextTickの役割といくつかの簡単な使用シナリオを理解する文章その機能は何ですか?遅延コール...

一般的なCSS3アニメーションの実装方法

1. 何ですかCSS アニメーションは、CSS を使用して拡張マークアップ言語 (XML) 要素をア...

Tomcat マルチインスタンスの展開と構成の原則

1. ファイアウォールをオフにし、Tomcatのインストールに必要なソフトウェアパッケージを/opt...

Apple M1チップにnginxをインストールし、vueプロジェクトをデプロイする詳細な手順

nginx をインストールApple Mac ではインストールに brew を使用します。brew ...

type=fileファイル変更フォームの名前が正常にエコーされない問題を解決

easyui フレームワークのコードは次のとおりです。 css: .ファイルボックス{ フロート:...

LinuxにComposerをインストールする方法

1. インストールスクリプト(composer-setup.php)を現在のディレクトリにダウンロー...

MySql 8.0 と対応するドライバー パッケージの一致に関する注意事項

MySql 8.0 対応ドライバパッケージのマッチングMySql データベースをバージョン 8.0 ...

CSSをインポートする方法は何ですか?linkと@importの違いは何ですか?選択方法

Taobao のウェブページはインポートを使用していますが、多くのウェブサイトはリンクを使用していま...

VS2019 が mysql8.0 データベースに接続する方法 (画像とテキスト付き)

1. まず、VS2019とMySQLデータベースを準備します。どちらも公式サイトからダウンロードで...