Answer
t.me/js_testОтвет:
First Third Second
Объяснение:
Мы вызываем функцию setTimeout первой. Тем не менее, она выводится в консоль последней
Это происходит из-за того, что в браузерах у нас есть не только рантайм движок, но и WebAPI. WebAPI предоставляет нам функцию setTimeout и много других возможностей. Например, DOM.
После того как коллбек отправлен в WebAPI, функция setTimeout (но не коллбек!) вынимается из стека.
Теперь вызывается foo, и "First" выводится в консоль.
foo достается из стека, и вызывается baz. "Third" выводится в консоль.
WebAPI не может добавлять содержимое в стек когда захочет. Вместо этого он отправляет коллбек-функцию в так называемую очередь.
Здесь на сцену выходит цикл событий (event loop). Event loop проверяет стек и очередь задач. Если стек пустой, то он берет первый элемент из очереди и отправляет его в стек.
Вызывается bar, в консоль выводится "Second" и эта функция достается из стека.
Код для проверки:
const foo = () => console.log("First");
const bar = () => setTimeout(() => console.log("Second"));
const baz = () => console.log("Third");
bar();
foo();
baz();