May 15, 2023

Что будет на выходе?

Ответ: 1, 5, 3, 4, 2
Пояснение:

1. Несмотря на то, что функция setTimeout в первой строке имеет нулевой тайм-аут, вызов callback функции не происходит сразу. Движок поместит callback функцию в callback queue (macrotask queue) и переместит ее в стек вызовов, когда тот будет пуст. Поэтому первой в консоль выведется цифра 1.

2. Функция, которую принимает в качестве аргумента конструктор Promise, выполняется синхронно. Поэтому второй в консоль попадёт цифра 5.

3. Как и в случае с setTimeout, сallback в методе then выполняется асинхронно несмотря на то, что promise резолвится без задержки. Разница с setTimeout в том, что движок поместит promise callback в другую очередь - job queue (microtask queue), где тот будет дожидаться своей очереди на выполнение. Поэтому следующей в консоль попадает цифра 3.

4. Когда весь синхронный код завершен, настает очередь колбэков, которые дожидаются своего выполнения.
Microtasks (promises) имеют больший приоритет, чем macrotasks (setTimeout), поэтому следующей в консоль попадет цифра 4 и последней - 2.