検索

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

JavaScript - if ステートメントは関数宣言に影響します

リーリー リーリー

関数宣言の昇格が if スコープにのみ昇格される場合、上記の理由は何ですか? (Chrome58テスト) ifのスコープ内の関数が外部からアクセスできるのはなぜですか? 答えを教えてください

滿天的星座滿天的星座2845日前759

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

  • 伊谢尔伦

    伊谢尔伦2017-06-12 09:29:40

    これは実は歴史的な問題です...

    以前の ES5 の仕様では、関数はトップレベル スコープと関数スコープでのみ宣言でき、ブロックレベル スコープでは宣言できないと規定されていました。したがって、次のようなステートメントは実際には違法です:

    リーリー

    しかし実際には、互換性を考慮して、すべての主要なブラウザがこの仕様に準拠しているわけではありません。

    現在のES6時代では、仕様でブロックレベルスコープの存在が規定されており、ブロックレベルスコープで関数を定義できるようになりました。
    しかし、実際には、物事はそれほど単純ではありません。この場合、定義された関数の動作は過去と互換性がなくなるため、ES6 では、過去との互換性を確保するために、ブラウザーの実装が必要ないことを付録 B で規定しています。上記の規定を遵守し、独自の行動をとってください。


    ES6 ブラウザでは、実際には次のように動作します:

    1. ブロックスコープでの関数の定義を許可します

    2. 関数宣言は実際には var を使用して宣言された関数式と同様になり、関数名は現在の関数スコープの先頭に昇格されます

    3. 同時に、関数宣言はブロックレベルのスコープでのホイスティング動作も維持します

    最初のコードで、報告されるエラーを詳しく見てみると、エラーが次のようなものであることがわかります: Uncaught TypeError: e is not a functionUncaught TypeError: e is not a function
    这个错误表示,e不是函数,换句话来说,就是eこのエラーは、e が関数ではないことを意味します。つまり、変数 e は存在しますが、関数ではありません。上で述べた 3 つのルールを組み合わせると、実際には次のように実行されると考えるのは簡単です:

    リーリー

    変数昇格後は次のようになります:

    リーリー

    2 番目のコードについては言及する必要はありません。

    返事
    0
  • 滿天的星座

    滿天的星座2017-06-12 09:29:40

    if ステートメント内の関数宣言は、関数式と同様に昇格されないため、最初の関数宣言は構文エラーとなり、2 番目の関数宣言は 10 を出力します

    返事
    0
  • 欧阳克

    欧阳克2017-06-12 09:29:40

    リーリー

    =>

    に相当 リーリー

    返事
    0
  • キャンセル返事