JavaScript における変数プロモーションとは何ですか?この記事では、js での変数プロモーションについて説明し、変数プロモーションが存在する理由を紹介します。
JavaScript はシングルスレッド言語であるため、順番に実行する必要があります。ただし、1 行ずつ分析して実行するのではなく、部分ごとに分析して実行し、最初にコンパイル フェーズが実行され、次に実行フェーズが実行されます。コンパイル段階中、コードが実際に実行される数ミリ秒前に、すべての変数と関数の宣言が検出され、Lexical Environment と呼ばれる JavaScript データ構造内のメモリに追加されます。したがって、これらの変数と関数は、実際に宣言される前に使用できます。
簡単な例から始めましょう:
a = 2; var a; console.log(a);
上記のコードは何を出力しますか? このコードが上から下に実行されると、間違いなく未定義の出力が出力されますが、JavaScript は次のような言語ではありません。トップダウンで実行されます。 このコードの出力は 2 ですが、これは予想外でしょうか?では、なぜこのようなことが起こっているのでしょうか? 重要な点は、変数プロモーションにあります。現在のスコープ内のすべての変数の宣言をプログラムの先頭に上げます。したがって、上記のコードは次のコードと同等です。これでより明確になりますか?
var a; a = 2; console.log(a);
次に、別の例を見てみましょう:
console.log(a); var a = 2;
このコードは何を出力しますか?出力2? 実際、このコードは unknown を出力します。これが理由です?先ほども言いましたが、JavaScript では変数の宣言は先頭に昇格しますが、代入文は昇格しません。js の場合、var a = 2 は2 段階の解析:
var a; a = 2;
そして、js は文 var a のみをプロモートするので、今のステートメントは次と同等です:
var a; console.log(a); a = 2;
変数昇格という現象はなぜ起こるのでしょうか? なぜなら、js は他の言語と同様、コンパイルと実行の段階を経る必要があるからです。 js がコンパイル段階にあるとき、すべての変数宣言を収集して事前に変数を宣言し、他のステートメントの順序は変更されないため、コンパイル段階では最初のステップが実行され、2 番目の部分が実行されます。ステートメントが実行フェーズで実行される場合のみ。
jsの変数宣言は大きく分けてvar宣言、let、const宣言、関数宣言の3種類に分かれます。 関数宣言が他の宣言と一緒に出現すると、競合が発生する可能性があります。下を見てみましょう:
fn(); function fn () { console.log('fn'); } var fn = 2;
何が出力されると思いますか?これを書くとエラーになりますか? 実際、出力結果は fn になります。これは、関数宣言が他の宣言と一緒に現れた場合、どちらが優先されるのかという、先ほどの質問の説明になります。答えは、関数宣言は何よりも重要です。結局のところ、関数は jsの貴族クラスです。
非常に多くの関数宣言をどうすればよいでしょうか?
fn(); function fn () { console.log('1'); } function fn () { console.log('2'); }
上記のコードの出力結果は 2 です。これは、に複数の関数宣言がある場合、最後の関数宣言が前のを置き換えるためです。
最後の例が 1 つあります:
fn(); var fn = function () { console.log('fn'); }
上記を理解すると、これは非常に簡単になるでしょうか。これも 2 番目の例と同じで、var fn = function() {} という形式を関数式と呼びます。 実際には 2 つの部分に分かれています。
var fn; fn = function() {};
例 2 を参照すると、この結果はエラーになることがわかります (fn は宣言されていますが割り当てられていないため、fn は未定義であるため)。
それでは、まとめてみましょう。
js は、変数の宣言を js の先頭に昇格させて実行します。var a = 2 などのステートメントでは、分割され、var a ステップが昇格されます。
変数プロモーションの本質は、JS エンジンがコンパイル時にすべての変数を宣言するため、実行時にはすべての変数が宣言されているということです。
同じ名前の変数が複数ある場合、関数宣言は他の宣言を上書きします。複数の関数宣言がある場合、最後の関数宣言が以前のすべての宣言をオーバーライドします。
プログラミング関連の知識について詳しくは、プログラミング入門をご覧ください。 !
以上がjsの変数プロモーションとは何ですか?なぜ変動プロモーションがあるのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。