Результат: foo, end, bar, timer. Foo выполняется синхронно, но передача bar в then только регистрирует будущий обработчик.
Порядок вызовов foo и bar с Promise
Результат: foo, end, bar, timer. Foo выполняется синхронно, но передача bar в then только регистрирует будущий обработчик.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите вывод:
function bar() { console.log('bar'); }
function foo() {
console.log('foo');
Promise.resolve().then(bar);
}
setTimeout(() => console.log('timer'), 0);
foo();
console.log('end');
Ответ
Результат: foo, end, bar, timer. Foo выполняется синхронно, но передача bar в then только регистрирует будущий обработчик.
Если написать .then(bar()), bar вызовется немедленно, а then получит возвращённое им undefined. Это другой порядок и другая семантика. Аналогичное различие между передачей функции и её вызовом важно для обработчиков событий, таймеров и callbacks библиотек.