Вывод: 'start' будет напечатан сразу — синхронно при выполнении скрипта. Короткое объяснение поведения event loop и микрозадач: - Сценарий выполняется внутри текущей макрозадачи (task) — весь синхронный код выполняется немедленно. В вашем примере это единственный вызов console.log('start'), поэтому он выводится сразу. - Микрозадачи (microtasks) — это callbacks от Promise.then, MutationObserver и т.п. Они помещаются в очередь во время выполнения макрозадачи и выполняются только после завершения текущей макрозадачи, но перед следующей макрозадачей и перед перерисовкой. - Порядок (в браузере), упрощённо: 1\text{1}1 — выполнить весь синхронный код текущей макрозадачи; 2\text{2}2 — выполнить все микрозадачи из очереди (пока очередь не опустеет); 3\text{3}3 — возможная перерисовка/отрисовка; 4\text{4}4 — перейти к следующей макрозадаче (setTimeout, I/O, события и т.д.). - В Node.js есть дополнительная очередь (например, process.nextTick), которая обычно выполняется раньше других микрозадач. Если бы в коде были асинхронные вещи (пример для наглядности): console.log('start') Promise.resolve().then(() => console.log('micro')) setTimeout(() => console.log('macrotask'), 0) console.log('end') Порядок вывода был бы: 'start', 'end', 'micro', 'macrotask' — потому что микрозадача выполняется после синхронного кода текущей макрозадачи, но до следующей макрозадачи.
Короткое объяснение поведения event loop и микрозадач:
- Сценарий выполняется внутри текущей макрозадачи (task) — весь синхронный код выполняется немедленно. В вашем примере это единственный вызов console.log('start'), поэтому он выводится сразу.
- Микрозадачи (microtasks) — это callbacks от Promise.then, MutationObserver и т.п. Они помещаются в очередь во время выполнения макрозадачи и выполняются только после завершения текущей макрозадачи, но перед следующей макрозадачей и перед перерисовкой.
- Порядок (в браузере), упрощённо:
1\text{1}1 — выполнить весь синхронный код текущей макрозадачи;
2\text{2}2 — выполнить все микрозадачи из очереди (пока очередь не опустеет);
3\text{3}3 — возможная перерисовка/отрисовка;
4\text{4}4 — перейти к следующей макрозадаче (setTimeout, I/O, события и т.д.).
- В Node.js есть дополнительная очередь (например, process.nextTick), которая обычно выполняется раньше других микрозадач.
Если бы в коде были асинхронные вещи (пример для наглядности):
console.log('start')
Promise.resolve().then(() => console.log('micro'))
setTimeout(() => console.log('macrotask'), 0)
console.log('end')
Порядок вывода был бы: 'start', 'end', 'micro', 'macrotask' — потому что микрозадача выполняется после синхронного кода текущей макрозадачи, но до следующей макрозадачи.