『JavaScript 高度なプログラミング』第 7 章 関数、関数宣言の促進に関して、次のような例があります。 リーリー
この本の原文には次のように書かれています:
表面上、上記のコードは、条件が true の場合は、sayHi() の 1 つの定義を使用し、それ以外の場合は、別の定義を使用することを意味します。実際、これは ECMAScript では無効な構文であり、JavaScript エンジンはエラーを修正して適切な状態に変換しようとします。しかし問題は、ブラウザがエラーを修正しようとする試みが一貫していないことです。ほとんどのブラウザは条件を無視して 2 番目のステートメントを返しますが、Firefox は条件が true の場合に最初のステートメントを返します。したがって、この使用法は危険であるため、コード内で使用しないでください。しかし、chrome と js bin でテストし、条件を true に変更したところ、「Hi」というアラートが得られ、本に書かれている「ほとんどのブラウザは 2 番目のステートメントを返し、条件を無視する」というような問題は発生しませんでした。 、どうしてこれなの:### リーリー
アドバイスをお願いします、ありがとうございます!
true は変数ではなくリテラルです。ブラウザは、次のように、解析時に if ステートメントを直接最適化します。 リーリー
ただし、著者は別の状況について言及していますリーリー
コンパイラーがこのコードを取得すると、同じスコープ内に重複する関数宣言が 2 つあることがわかり、最初の宣言は 2 番目の宣言に直接置き換えられます。
js では、ブロック内で関数を宣言することはお勧めしません。
厳密モードでは、このコードはエラーを直接報告します。