JavaScript にはブロック スコープではなく関数スコープがあり、宣言はブロックから親関数の先頭に引き上げられると思いました。
ただし、次のコードは期待どおりに機能しません。
function one(a) {
console.log("one called for " + a);
if (a == 1) {
function inner(b) {
console.log("inner called for " + b);
}
inner(123);
}
inner(456);
}
one(1);
one(2);
one(3);
最初のone(1);
呼び出しはエラーなしで正常に処理されますが、2 番目の呼び出しで実行が停止しone(2);
ます。
この動作は直感的です。関数inner
は の場合にのみ定義されa==1
ます。
しかし、スコープ/ホイスト ルールとどのように整合性があるのでしょうか?
if
その定義は、効果がないはずのブロックの外で、そのスコープの一番上に引き上げられると思いました!
編集:ここに私が得ているエラーがあります:
ブラウザは Firefox です。ここでフィドル。