Gernar
JavaScript: асинхронность

Какие знаешь макрозадачи

Разбор вопроса «Какие знаешь макрозадачи» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.

Вопрос

Какие знаешь макрозадачи

Профессия

Frontend Developer

Что хочет услышать интервьюер

Интервьюер хочет проверить понимание работы Event Loop в JavaScript, знание различий между макрозадачами и микрозадачами, а также умение объяснить их роль в асинхронном выполнении кода.

Ключевые тезисы

  • Макрозадачи — это задачи, которые выполняются в основном потоке JavaScript, такие как выполнение скриптов, рендеринг, обработка событий.
  • Примеры макрозадач: setTimeout, setInterval, UI рендеринг, обработка пользовательских событий (клики, скроллы).
  • Макрозадачи обрабатываются Event Loop после выполнения текущего call stack и перед переходом к микрозадачам.

Подробный ответ

Макрозадачи — это задачи, которые выполняются в основном потоке JavaScript. Они включают выполнение скриптов, рендеринг, обработку событий и другие операции, которые требуют времени и ресурсов. Event Loop управляет выполнением макрозадач, помещая их в очередь и выполняя их после завершения текущего call stack. Это позволяет JavaScript быть асинхронным и не блокировать выполнение других задач. Примеры макрозадач: setTimeout, setInterval, UI рендеринг, обработка пользовательских событий (клики, скроллы). Макрозадачи обрабатываются после выполнения текущего call stack и перед переходом к микрозадачам. Это важно понимать, так как порядок выполнения задач может влиять на производительность и поведение приложения. Например, если макрозадача занимает слишком много времени, это может задержать рендеринг и обработку других событий, что приведет к ощущению «зависания» интерфейса.

Практические примеры

Пример 1

Пример использования setTimeout: setTimeout(() => { console.log('Эта макрозажда выполнится через 1 секунду'); }, 1000); Этот код добавляет макрозадачу в очередь, которая выполнится через указанное время.

Пример 2

Пример обработки клика: document.addEventListener('click', () => { console.log('Клик обработан как макрозадача'); }); Здесь обработка клика добавляется в очередь макрозадач и выполняется после завершения текущего call stack.

Пример 3

Пример с setInterval: setInterval(() => { console.log('Эта макрозадача будет повторяться каждую секунду'); }, 1000); Этот код создает периодическую макрозадачу, которая выполняется каждую секунду.

Частые ошибки

  • Ошибка: Использование setTimeout с нулевой задержкой (setTimeout(() => {}, 0)) для выполнения кода «немедленно». Это не гарантирует выполнение кода сразу, так как задача все равно попадает в очередь макрозадач и может быть отложена.
  • Ошибка: Непонимание порядка выполнения макрозадач и микрозадач. Например, кандидаты могут думать, что setTimeout выполнится раньше, чем промисы, что неверно, так как микрозадачи (например, промисы) выполняются перед макрозадачами.

Связанные темы

  • Event Loop и его работа в JavaScript
  • Микрозадачи и их отличие от макрозадач
  • Оптимизация производительности веб-приложений
  • requestAnimationFrame и его использование для анимаций

Follow-up вопросы

Чем макрозадачи отличаются от микрозадач?

Уровень: basic

Макрозадачи выполняются в основном потоке после очистки call stack, а микрозадачи (например, Promise.then) выполняются сразу после текущей макрозадачи, перед следующей. Event Loop обрабатывает микрозадачи перед макрозадачами.

Как setTimeout влияет на порядок выполнения макрозадач?

Уровень: intermediate

setTimeout добавляет функцию в очередь макрозадач после указанной задержки. Если call stack не пуст или есть другие макрозадачи, выполнение может задержаться. Минимальная задержка — 4мс (вложенные вызовы).

Может ли макрозадача блокировать рендеринг?

Уровень: intermediate

Да, если макрозадача (например, тяжелый синхронный код) выполняется дольше 16мс (для 60fps). Браузер не может обработать рефлоу/репайнт до завершения задачи, что приводит к "фризам" интерфейса.

Как requestAnimationFrame соотносится с макрозадачами?

Уровень: advanced

requestAnimationFrame выполняется перед ререндерингом страницы (в цикле рендеринга), но после микрозадач. Это не совсем макрозадача — его колбэк попадает в отдельную очередь, оптимизированную для анимаций.

Какие есть способы оптимизации работы с макрозадачами?

Уровень: advanced

  1. Разбивать тяжелые задачи на части через setTimeout/setInterval. 2) Использовать Web Workers для выноса логики из основного потока. 3) Приоритизировать критичные задачи через requestIdleCallback.

Содержание