ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript での宣言のプロモーションについて話しましょう
この記事では、JavaScript に関する関連知識を提供します。主にステートメントのプロモーションに関する関連コンテンツを紹介します。ステートメントのプロモーションは JavaScript パーサーの機能であり、コード内の関数に影響を与えます。効果変数宣言文の を、それが配置されているスコープの先頭に抽出しますので、見てみましょう。
[関連する推奨事項: JavaScript ビデオ チュートリアル 、Web フロントエンド ]
ステートメントの改善 (ホスティング) は JavaScript パーサーの機能であり、コード内の関数と変数の宣言ステートメントを、それらが配置されているスコープの前に抽出します。
JavaScript は、関数宣言前の関数呼び出しをサポートしています。
say();function say() { console.log("Hello"); }
パーサーはスコープ内のコードをスキャンし、関数宣言を実行コードの先頭に抽出します。したがって、パーサーはこのコードを次のように調べます。
function say() { console.log("Hello"); }say();
通常の関数に加えて、async function
、function *
、async function *
同様のリフティング効果もあります。
var
変数宣言の昇格 var
キーワードの変数宣言は昇格されますが、変数の割り当ては昇格されません。
console.log(foo); // undefinedvar foo = "bar";console.log(foo); // 'bar'
上記のコードの解析結果は次のとおりです:
var foo;console.log(foo); foo = "bar";console.log(foo);
これにより、奇妙な問題が発生する可能性があります:
var x = "x in global"; (function () { // 这里期望读取全局变量 console.log(x); // 结果为undefined. /* ... */ // 在函数内某处 var x = "x in function"; })();
以前は、この奇妙な改善を回避するために、誰もが通常、スコープの先頭に var
宣言を置きます。
var x='x';var y='y';function (){ var x; var foo; // ...}
もちろん、ここでは var
を使用せず、より合理的な let
と const
を使用することにします。
let
と const
変数宣言とデッドゾーン 次に、let
と const
は次のようになります。変動昇進はないのですか? - 必ずしも。
次の例を見てください:
const x = "x in global"; (function () { // 这里期望读取全局变量 console.log(x); // ReferenceError: Cannot access 'x' before initialization /* ... */ // 在函数内某处 const x = "x in function"; })();
実行エラーが報告され、const x = "x in function";
1 行が、領域内の上位市外局番に影響を与えます。範囲。
パーサーは、現在のスコープ内の const
および let
宣言をスキャンします。宣言ステートメントの前に変数名を使用すると、ReferenceError
がトリガーされます。これにより、前述の var
プロモーションの問題とあいまいなコード パターンが回避されます。
class
キーワードにも同じ効果があり、new
未宣言のクラスも ReferenceError
を引き起こします。
new MyClass(); // ReferenceError: Cannot access 'MyClass' before initializationclass MyClass {}
この状況は改善ではないと考える人もいます。結局のところ、宣言と割り当ては事前に行われていないためです。また、これらの宣言は実行前に影響を及ぼし、その効果が改善されると考える人もいます。個人的には、識別子 (変数名とクラス名) を促進する後者の方が好きです。
一部の JavaScript 宣言ステートメントの効果は、それが配置されているスコープ全体に影響を及ぼします。この現象はプロモーションと呼ばれます。
プロモーションには 3 つのタイプがあります:
#function
キーワードの宣言と割り当ての両方がプロモーションされます。 var
キーワード宣言は昇格されますが、割り当ては昇格されません。 let
、const
、class
識別子が昇格されてデッド ゾーンが形成され、宣言も代入も昇格されません。 [関連する推奨事項: JavaScript ビデオ チュートリアル 、Web フロントエンド ]
以上がJavaScript での宣言のプロモーションについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。