ホームページ >ウェブフロントエンド >jsチュートリアル >条件文内の関数宣言は JavaScript で予期しない動作を引き起こす可能性がありますか?

条件文内の関数宣言は JavaScript で予期しない動作を引き起こす可能性がありますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-02 21:26:30532ブラウズ

Can Function Declarations Within Conditional Statements Lead to Unexpected Behavior in JavaScript?

条件付きステートメント内の関数宣言: ケーススタディ

この質問は、if/else ステートメント内にネストされている場合の関数宣言の動作を中心に展開します。従来、JavaScript では、コード内の物理的な位置に関係なく、関数宣言はホイストされ、グローバル スコープを持っていました。 ES5 厳密モードでは、関数宣言はトップレベルのスコープまたは関数内に制限されていました。非厳密モードでは予期しない動作が発生し、ブラウザ間で不一致が発生しました。

以下の例:

<code class="js">var abc = '';
if (1 === 0) {
  function a() {
    abc = 7;
  }
} else if ('a' === 'a') {
  function a() {
    abc = 19;
  }
} else if ('foo' === 'bar') {
  function a() {
    abc = 'foo';
  }
}
a();
document.write(abc); //writes "foo" even though 'foo' !== 'bar'</code>

最新の JavaScript (ES2015 以降) では、ブロック内での関数宣言が許可されるようになりました。 。ただし、それらのスコープは、宣言されているブロックに限定されます。これは、上記の例では次のことを意味します。

  • 厳密な ES5 環境で実行している場合、ブロック内で関数を宣言できないため、コードはエラーを生成します。
  • 非厳密な ES5 環境では、ブラウザーが異なると動作が異なる場合があります。
  • ES2015 環境では、関数 a は各 if ステートメントのスコープ内で宣言されます。したがって、a() が呼び出されると、グローバル スコープで宣言された abc 変数にアクセスし、それに値 'foo' (最後の else if ステートメントで割り当てられた値) を割り当てます。

To条件付きで関数を定義する場合は、関数宣言の代わりに関数式を使用することをお勧めします。これにより、関数のスコープが明示的に定義され、予測可能であることが保証されます。

以上が条件文内の関数宣言は JavaScript で予期しない動作を引き起こす可能性がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。