Javascript — подъем внутри обычного блока

Я изучаю подъем javascript из книги Scope & Closures, первой из серии книг You Don't Know Js. Я понимаю, как работает подъем, но когда дело доходит до этого примера, он ведет себя по-другому.

foo(); // "b"

var a = true;
if (a) {
   function foo() { console.log( "a" ); }
}
else {
   function foo() { console.log( "b" ); }
}

В книге упоминается, что вывод должен быть «b» из-за подъема и переопределения функций, но результатом в моем браузере является эта ошибка.

Uncaught TypeError: foo is not a function
    at <anonymous>:1:1

Так что же в этом случае произошло, чтобы выкинуть TypeError?


person MrCoder    schedule 31.07.2018    source источник
comment
прямо под этим примером в книге «Вы не знаете JS», — говорит он. функции в блоках.   -  person LShapz    schedule 01.08.2018
comment
Я не верю, что это действительно был дубликат. Вы получаете TypeError, потому что пытались вызвать foo() до того, как объявили его.   -  person mrshl    schedule 01.08.2018
comment
@unmarshalled Я почти уверен, что это дубликат, вам следует узнать о подъеме. Проверьте, например. это: foo(); function foo() { console.log("works!"); }.   -  person ASDFGerte    schedule 01.08.2018
comment
@ASDFGerte Похоже, ты прав! Спасибо, что указали на то, чего я не знаю.   -  person mrshl    schedule 01.08.2018