Первое — function declaration, второе — function expression. Разница в hoisting и области имени.
Поведение
Declaration поднимается целиком — вызов до строки объявления работает. У expression с var до присваивания foo равен undefined → TypeError: foo is not a function.
foo(); // окfunctionfoo() {
console.log('ok');
}
bar(); // TypeErrorvar bar = function () {
console.log('ok');
};
Именованный expression: имя видно только внутри функции (для рекурсии/стека), снаружи — ReferenceError.
С let/const expression попадает в TDZ до объявления.
Итог
Declaration доступна раньше по коду; expression — нет. Это частый вопрос на junior/middle.
На собеседовании
Ожидают не заученную таблицу, а умение связать концепцию с багом из практики: что сломается, если выбрать неправильный вариант, и какой код вы напишете в реальном PR. Короткий пример и граничный случай обычно ценятся выше длинной теории.
Чем отличается использование `foo` в `function foo() {}` и в `var f… · Sobeso