JS Hoisting в условных операторах не дает ожидаемого результата

Я читаю книгу «Вы не знаете JS», и я прочитал эту часть: введите здесь описание изображения

Здесь автор имеет в виду, что эти функции foo будут подняты на глобальном уровне, поскольку условные операторы не имеют возможности создавать свою собственную область видимости в JS. Таким образом, ожидаемое поведение состоит в том, что я напечатаю b.

Однако результатом является ошибка: «Uncaught TypeError: foo не является функцией в: 1: 1»

Однако, если я сделаю это:

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

а затем вызвать функцию я получу результат "а"?


person BoSsYyY    schedule 02.06.2018    source источник
comment
Ну, автор не правильно понял (или вы не поняли?). Существует функция, называемая условно созданными функциями, см. объявление функции. в MDN. Сама функция широко не поддерживается, на самом деле она была официально добавлена ​​​​в ES6, хотя, например. FireFox реализовал это в течение многих лет.   -  person Teemu    schedule 02.06.2018
comment
Поведение, описанное автором, устарело. (Это два раза за один день устаревшее поведение появлялось в связи с «Вы не знаете JS». Первое поведение, описанное в 2009 году, было довольно шокирующим, поскольку «Вы не знаете JS» было написано значительно позже. Однако это изменилось в ES2015.)   -  person T.J. Crowder    schedule 02.06.2018
comment
@Teemu Это не функция. Он включен в раздел ES6 о режиме совместимости, чтобы определить согласованное поведение. В строгом режиме это все еще обычная ошибка. (подробности см. во втором дубликате)   -  person Bergi    schedule 02.06.2018
comment
@Bergi - Использование объявления функции в качестве оператора не является ошибкой в ​​​​строгом режиме. (Приведенный выше код таков, потому что foo не объявляется там, где он используется, а объявление функций в условных блоках — нет.)   -  person T.J. Crowder    schedule 04.06.2018
comment
@ T.J.Crowder Да, я имел в виду, что использование функции за пределами области ее блока является ошибкой.   -  person Bergi    schedule 04.06.2018
comment
@ Берги - Попался.   -  person T.J. Crowder    schedule 04.06.2018