JavaScript では、関数宣言は、一般的な言語標準と実行される環境に応じて異なる動作をします。
厳密モード (ES5)
ECMAScript 5 (ES5) で導入された厳密モードでは、条件ステートメント内での関数宣言は許可されません。これは、関数宣言によって、関数全体またはグローバル スコープにスコープされるホイスト変数が作成されるためです。これらを条件ステートメント内に配置すると、この巻き上げメカニズムが壊れます。
非厳密モード (ES5)
ただし、非厳密モードでは、関数宣言の動作が異なります。条件ステートメント内でのエラーは予測できませんでした。さまざまなブラウザーや JavaScript エンジンがこの状況に対処するための独自のルールを実装しており、一貫性のない結果が生じていました。
モダン JavaScript (ES2015) では
2018 年現在、ほとんどの最新ブラウザーはECMAScript 2015 (ES2015) をサポートします。これにより、ブロック内の関数宣言のより厳密な解釈が導入されました。 ES2015 では、関数宣言は、宣言されているブロックにスコープされます。
例:
次のコードを考えてみましょう:
<code class="javascript">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>
厳密モードまたは ES2015 では、関数 a がグローバル スコープで定義されていないため、このコードはエラーになります。ただし、非厳密モードでは、実装に応じて異なる出力が生成される可能性があります。この例では、Chrome は「foo」を出力し、Firefox は「19」を出力します。
推奨事項:
予期しない動作を避けるために、代わりに関数式を使用することをお勧めします。関数を条件付きで定義する場合の関数宣言の説明。関数式は、直接のスコープ内でのみアクセスできるスコープ付き関数を作成します。
以上がJavaScriptの条件文内で関数を宣言できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。