Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: mutationobserver, microtask

Являются ли колбэки MutationObserver микротасками или макротасками? Почему?

Этот вопрос проверяет понимание event loop и категоризацию задач в JavaScript, особенно для API наблюдения за DOM.

Короткий ответ

Колбэки MutationObserver являются микротасками (microtasks). Они выполняются в той же фазе event loop, что и Promise, но после них. Это обеспечивает высокий приоритет выполнения и гарантирует, что наблюдения за изменениями DOM обрабатываются до следующего рендеринга браузера.

Длинный ответ

MutationObserver использует микротаски для обеспечения своевременного и эффективного отслеживания изменений DOM.

Место в event loop:

Порядок выполнения задач:

  1. Макротаски (Macrotasks): setTimeout, setInterval, I/O

  2. Микротаски (Microtasks): Promise, queueMicrotask, MutationObserver

  3. Рендеринг: Browser repaint/reflow

  4. Следующая итерация: Переход к следующей макротаске

Детали реализации:

Поведение MutationObserver:

// Создание observer
const observer = new MutationObserver((mutations) => {
  console.log('DOM изменился'); // Это микротаска
});

// Наблюдение за изменениями
observer.observe(document.body, {
  childList: true,
  subtree: true
});

// Пример порядка выполнения
console.log('Start');

setTimeout(() => {
  console.log('setTimeout'); // Макротаска
}, 0);

Promise.resolve().then(() => {
  console.log('Promise'); // Микротаска
});

// Изменение DOM
document.body.appendChild(document.createElement('div'));

console.log('End');

// Порядок вывода:
// "Start"
// "End" 
// "Promise" - микротаска Promise
// "DOM изменился" - микротаска MutationObserver
// "setTimeout" - макротаска

Преимущества микротаск:

Своевременность выполнения:

  • Обработка изменений DOM до следующего рендеринга

  • Гарантированный порядок относительно других микротаск

  • Высокий приоритет в event loop

Эффективность:

  • Группировка множественных изменений в один колбэк

  • Избежание "дребезга" при частых изменениях

  • Оптимизация производительности

Сравнение с другими подходами:

MutationObserver vs setTimeout:

// MutationObserver (микротаска)
observer.observe(element, { attributes: true });
element.setAttribute('data-test', 'value');
// Колбэк выполнится до следующего рендеринга

// setTimeout (макротаска)
element.setAttribute('data-test', 'value');
setTimeout(() => {
  // Колбэк выполнится после рендеринга
}, 0);

Практическое значение:

  • MutationObserver идеален для реактивных систем

  • Гарантирует актуальность данных до визуального обновления

  • Используется в современных фреймворках для отслеживания изменений

Уровень

  • Рейтинг:

    1

  • Сложность:

    9

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#mutationobserver

#microtask

Подпишись на React Developer в телеграм