現在のES6時代では、仕様でブロックレベルスコープの存在が規定されており、ブロックレベルスコープで関数を定義できるようになりました。 しかし、実際には、物事はそれほど単純ではありません。この場合、定義された関数の動作は過去と互換性がなくなるため、ES6 では、過去との互換性を確保するために、ブラウザーの実装が必要ないことを付録 B で規定しています。上記の規定を遵守し、独自の行動をとってください。
最初のコードで、報告されるエラーを詳しく見てみると、エラーが次のようなものであることがわかります:Uncaught TypeError: e is not a function。Uncaught TypeError: e is not a function。 这个错误表示,e不是函数,换句话来说,就是eこのエラーは、eが関数ではないことを意味します。つまり、変数eは存在しますが、関数ではありません。上で述べた 3 つのルールを組み合わせると、実際には次のように実行されると考えるのは簡単です:
これは実は歴史的な問題です...
以前の ES5 の仕様では、関数はトップレベル スコープと関数スコープでのみ宣言でき、ブロックレベル スコープでは宣言できないと規定されていました。したがって、次のようなステートメントは実際には違法です:
リーリーしかし実際には、互換性を考慮して、すべての主要なブラウザがこの仕様に準拠しているわけではありません。
現在のES6時代では、仕様でブロックレベルスコープの存在が規定されており、ブロックレベルスコープで関数を定義できるようになりました。
しかし、実際には、物事はそれほど単純ではありません。この場合、定義された関数の動作は過去と互換性がなくなるため、ES6 では、過去との互換性を確保するために、ブラウザーの実装が必要ないことを付録 B で規定しています。上記の規定を遵守し、独自の行動をとってください。
ES6 ブラウザでは、実際には次のように動作します:
ブロックスコープでの関数の定義を許可します
関数宣言は実際には
var
を使用して宣言された関数式と同様になり、関数名は現在の関数スコープの先頭に昇格されます同時に、関数宣言はブロックレベルのスコープでのホイスティング動作も維持します
最初のコードで、報告されるエラーを詳しく見てみると、エラーが次のようなものであることがわかります:
リーリーUncaught TypeError: e is not a function
。Uncaught TypeError: e is not a function
。这个错误表示,
e
不是函数,换句话来说,就是e
このエラーは、e
が関数ではないことを意味します。つまり、変数e
は存在しますが、関数ではありません。上で述べた 3 つのルールを組み合わせると、実際には次のように実行されると考えるのは簡単です:変数昇格後は次のようになります:
リーリー2 番目のコードについては言及する必要はありません。
if ステートメント内の関数宣言は、関数式と同様に昇格されないため、最初の関数宣言は構文エラーとなり、2 番目の関数宣言は 10 を出力します
リーリー
=>
に相当 リーリー