ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript での宣言のプロモーションについて話しましょう

JavaScript での宣言のプロモーションについて話しましょう

WBOY
WBOY転載
2022-11-14 17:59:021189ブラウズ

この記事では、JavaScript に関する関連知識を提供します。主にステートメントのプロモーションに関する関連コンテンツを紹介します。ステートメントのプロモーションは JavaScript パーサーの機能であり、コード内の関数に影響を与えます。効果変数宣言文の を、それが配置されているスコープの先頭に抽出しますので、見てみましょう。

JavaScript での宣言のプロモーションについて話しましょう

[関連する推奨事項: JavaScript ビデオ チュートリアル Web フロントエンド ]

ステートメントの改善 (ホスティング) は JavaScript パーサーの機能であり、コード内の関数と変数の宣言ステートメントを、それらが配置されているスコープの前に抽出します。

関数のプロモーション

JavaScript は、関数宣言前の関数呼び出しをサポートしています。

say();function say() {  console.log("Hello");
}

パーサーはスコープ内のコードをスキャンし、関数宣言を実行コードの先頭に抽出します。したがって、パーサーはこのコードを次のように調べます。

function say() {  console.log("Hello");
}say();

通常の関数に加えて、async functionfunction *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 を使用せず、より合理的な letconst を使用することにします。

letconst 変数宣言とデッドゾーン

次に、letconst は次のようになります。変動昇進はないのですか? - 必ずしも。

次の例を見てください:

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 キーワード宣言は昇格されますが、割り当ては昇格されません。
  • letconstclass 識別子が昇格されてデッド ゾーンが形成され、宣言も代入も昇格されません。

[関連する推奨事項: JavaScript ビデオ チュートリアル Web フロントエンド ]

以上がJavaScript での宣言のプロモーションについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.imで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。