Я думал, что в 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);
проходит нормально, без ошибок, однако выполнение останавливается при вызове второго one(2);
.
Это поведение интуитивно понятно: функция inner
определяется только в том случае, если a==1
.
Но как это согласуется с правилами области видимости/поднятия?
Я думал, что его определение будет поднято наверх его области видимости, за пределы блока if
, который, как предполагается, не будет иметь никакого эффекта!
Изменить: вот ошибки, которые я получаю:
Браузер — Firefox. Поиграйте здесь.