JavaScript - if ステートメントは関数宣言に影響します
滿天的星座
滿天的星座 2017-06-12 09:27:40
0
3
726
リーリー リーリー

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

滿天的星座
滿天的星座

全員に返信(3)
伊谢尔伦

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

以前の 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
滿天的星座

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

いいねを押す +0
学霸

リーリー

=>

に相当 リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート