Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 088новых вакансий за сутки·80 376вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании6 799
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 400 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python14 930
  • Облачные технологии11 512
  • QA вакансии3 347
  • Backend вакансии1 791
  • Инженер данных1 397
  • Продакт-менеджер842

Разработка

  • Android1 731
  • iOS1 605
  • AI вакансии858
  • Fullstack вакансии725
  • Frontend вакансии617
  • Mobile вакансии31

По стеку

  • Go8 182
  • Java5 283
  • Node.js1 704
  • Kotlin1 419
  • Rust1 360
  • .NET1 290
  • PHP551
  • C++394
  • C#369

DevOps и инфраструктура

  • Kubernetes6 474
  • Linux-инфраструктура4 834
  • DevOps вакансии4 737
  • Terraform / IaC3 590
  • Мониторинг и Observability1 636
  • CI/CD1 541
  • SRE504
  • Кибербезопасность245

Аналитика и данные

  • Data Scientist769
  • Аналитик данных748
  • Бизнес-аналитик722
  • Системный аналитик94

Другие направления

  • Проджект-менеджер338
  • UI/UX дизайн105
  • Ручное тестирование14

По регионам

  • Вакансии в США40 526
  • Вакансии в Европе16 981
  • Вакансии в Канаде3 889
  • Работа в России3 872

По формату

  • Удалённые вакансии64 846
  • Релокация в США40 528
  • Гибридная работа9 711
  • Офисная работа6 552

По уровню

  • Senior вакансии35 880
  • Middle вакансии17 118
  • Junior вакансии5 838

Сейчас нанимают

Все компании
  • Wise193 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме JavaScriptВсе вопросы
JavaScriptSeniorТеория

Как работает event loop в JavaScript? Что такое call stack и task queue?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Event loop: движок выполняет call stack до пустоты, затем сбрасывает всю microtask queue (Promise.then, queueMicrotask), потом берёт одну task из macrotask queue (setTimeout, I/O) — и снова. Rendering opportunity между задачами, не между микрозадачами.

Пример: порядок вывода

console.log('A');                        // 1. synchronous

setTimeout(() => console.log('timer'), 0); // macrotask

Promise.resolve()
  .then(() => {
    console.log('promise 1');             // microtask
    return Promise.resolve();
  })
  .then(() => console.log('promise 2')); // microtask (добавляется после первого .then)

queueMicrotask(() => console.log('qMicrotask')); // microtask

console.log('B');                        // 2. synchronous

// Вывод:
// A
// B
// promise 1
// qMicrotask
// promise 2
// timer

После «B» call stack пуст. Event loop берёт microtask queue: выполняет «promise 1», затем «qMicrotask». «promise 2» добавляется в очередь, когда разрешается вложенный Promise — он тоже выполняется до macrotask. Только после полного опустошения microtask queue выполняется setTimeout-колбэк.

Архитектура однопоточного выполнения

JavaScript — однопоточный язык. Браузер (и Node.js) предоставляют runtime со следующими компонентами:

  • Call stack — стек вызовов функций. Каждый вызов создаёт фрейм; возврат из функции снимает фрейм.
  • Heap — память для объектов.
  • Microtask queue — очередь микрозадач: колбэки Promise.then/catch/finally, queueMicrotask(), MutationObserver.
  • Macrotask queue (Task queue) — очередь задач: setTimeout, setInterval, I/O-события, пользовательские события (click, keypress).

Алгоритм event loop

  1. Выполнить текущий call stack до пустоты.
  2. Опустошить всю microtask queue (каждая добавленная микрозадача тоже обрабатывается до перехода к шагу 3).
  3. Если нужен rendering (обычно ~60 раз/сек) — выполнить requestAnimationFrame-колбэки и перерисовать.
  4. Взять одну задачу из macrotask queue и поместить в call stack.
  5. Перейти к шагу 1.

Практическое следствие: блокировка main thread

// Плохо: синхронная тяжёлая операция блокирует rendering
function expensiveSort(arr) {
  // O(n²) на 100 000 элементов — зависание на ~2 сек
  return arr.sort((a, b) => a - b);
}

// Лучше: дробим через setTimeout (уступаем браузеру рендер между чанками)
async function chunkedSort(arr, chunkSize = 5000) {
  for (let i = 0; i < arr.length; i += chunkSize) {
    arr.splice(i, chunkSize, ...arr.slice(i, i + chunkSize).sort((a, b) => a - b));
    await new Promise(resolve => setTimeout(resolve, 0)); // rendering opportunity
  }
  return arr;
}

// Ещё лучше для CPU-задач: Web Worker (отдельный поток)

Node.js: дополнительные очереди

В Node.js модель расширена: process.nextTick() выполняется до Promise-микрозадач (это отдельная «nextTick queue»). setImmediate() — в конце текущей итерации event loop, после I/O-колбэков. Порядок setImmediate vs setTimeout(0) в Node.js не детерминирован вне I/O-контекста.

Подводные камни

  • Бесконечная microtask queue. Если микрозадача рекурсивно добавляет новые микрозадачи (Promise.resolve().then(self)), event loop никогда не дойдёт до macrotask и rendering. Страница зависнет без видимой ошибки.
  • setTimeout(fn, 0) — не «немедленно». Минимальная задержка в браузерах — 4 мс (по спецификации HTML) для вложенных таймеров. В Node.js — около 1 мс. Реальная задержка зависит от нагрузки.
  • await не означает «следующий тик». await Promise.resolve() помещает продолжение в microtask queue, а не в macrotask. Две await-паузы внутри одной async-функции — две микрозадачи, не два «тика» event loop.
  • Длинные синхронные операции блокируют UI. Нет yield-механизма внутри синхронного кода. Тяжёлые вычисления нужно дробить через setTimeout/scheduler.yield() или выносить в Web Worker.
  • Порядок process.nextTick vs Promise в Node.js. process.nextTick выполняется раньше Promise-микрозадач. Если в nextTick-колбэке бросить исключение, обработчик Promise может не успеть до него. Смешивание nextTick и Promise усложняет отладку.
  • requestAnimationFrame — не микрозадача и не macrotask. rAF выполняется в отдельном шаге перед rendering, после всех микрозадач. Изменение DOM в rAF колбэке гарантированно попадает в ближайший кадр; в setTimeout — нет.

Типичные ошибки

  • Смешивать «event loop» с похожим механизмом без критерия выбора.
  • Игнорировать риск: неверно оценить границы применения темы «event loop» и получить хрупкое решение.
  • Показывать только синтаксис и не объяснять поведение в runtime или сборке.

Что проверяет интервьюер

  • Объясняет порядок выполнения синхронного кода, задач и очередей микрозадач.
  • Показывает на примере, как работает: движок выполняет call stack до пустоты, затем обрабатывает microtasks перед следующей task; это объясняет порядок Promise-callback, timer, rendering opportunity и пользовательских событий.
  • Называет production-нюанс и граничный случай для темы «event loop».

Как вы знаете этот вопрос?

Проверить себя по теме JavaScript →

Источники

  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Execution_model
  • https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide/In_depth
←Предыдущий вопросДля каких задач JavaScript является сильным выбором, а где лучше честно выбрать другой язык?Следующий вопрос→Объясните понятие closure в JavaScript. Как closure может вызвать утечку памяти?

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

JavaScriptjavascript-runtimeperformance-debugging

Частые вопросы на собеседовании

  • Как защититься от XSS в браузерном приложении? Где помогают CSP, escaping и Trusted Types?
  • В чём разница между var, let и const? Как hoisting влияет на каждое из них?
  • Что такое Promise? Чем они отличаются от callback'ов?
  • Для каких задач JavaScript является сильным выбором, а где лучше честно выбрать другой язык?