検索

ホームページ  >  に質問  >  本文

javascript - Elevation での関数宣言の例との混同

『JavaScript 高度なプログラミング』第 7 章 関数、関数宣言の促進に関して、次のような例があります。 リーリー

この本の原文には次のように書かれています:

表面上、上記のコードは、条件が true の場合は、sayHi() の 1 つの定義を使用し、それ以外の場合は、別の定義を使用することを意味します。実際、これは ECMAScript では無効な構文であり、JavaScript エンジンはエラーを修正して適切な状態に変換しようとします。しかし問題は、ブラウザがエラーを修正しようとする試みが一貫していないことです。ほとんどのブラウザは条件を無視して 2 番目のステートメントを返しますが、Firefox は条件が true の場合に最初のステートメントを返します。したがって、この使用法は危険であるため、コード内で使用しないでください。

しかし、chrome と js bin でテストし、条件を true に変更したところ、「Hi」というアラートが得られ、本に書かれている「ほとんどのブラウザは 2 番目のステートメントを返し、条件を無視する」というような問題は発生しませんでした。 、どうしてこれなの:### リーリー

アドバイスをお願いします、ありがとうございます!

淡淡烟草味淡淡烟草味2790日前731

全員に返信(2)返信します

  • 为情所困

    为情所困2017-06-26 10:52:47

    true は変数ではなくリテラルです。ブラウザは、次のように、解析時に if ステートメントを直接最適化します。 リーリー

    ただし、著者は別の状況について言及しています

    リーリー

    返事
    0
  • 三叔

    三叔2017-06-26 10:52:47

    コンパイラーがこのコードを取得すると、同じスコープ内に重複する関数宣言が 2 つあることがわかり、最初の宣言は 2 番目の宣言に直接置き換えられます。
    js では、ブロック内で関数を宣言することはお勧めしません。
    厳密モードでは、このコードはエラーを直接報告します。

    返事
    0
  • キャンセル返事