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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python9 224
  • Облачные технологии6 770
  • QA вакансии2 176
  • Android1 322
  • Инженер данных940
  • Продакт-менеджер435

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C++273
  • C#210

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

  • Kubernetes4 025
  • Linux-инфраструктура3 060
  • DevOps вакансии2 713
  • Terraform / IaC2 214
  • Мониторинг и Observability1 106
  • CI/CD919
  • SRE341
  • Кибербезопасность90

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

  • Аналитик данных555
  • Data Scientist513
  • Бизнес-аналитик431
  • Системный аналитик65

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

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

По регионам

  • Вакансии в США29 375
  • Вакансии в Европе11 048
  • Работа в России3 627
  • Вакансии в Канаде2 514

По формату

  • Удалённые вакансии48 640
  • Релокация в США29 375
  • Гибридная работа5 790
  • Офисная работа4 553

По уровню

  • Senior вакансии25 029
  • Middle вакансии13 245
  • Junior вакансии4 377

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

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • 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 — нет.

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

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

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

  • Смешивать «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

Вакансии с этим навыком

JavaScript вакансии
  • Middle/Senior Full-Stack Python Engineer (Django) (#5841)
  • Salesforce Engineer - Backoffice Business Support Section, Business Support Development Department (BSD)
  • SAP BTP Architect/Engineer - Corporate IT Service Department (CITSD)
  • BTP Engineer - Business Support Development Department (BSD)
  • Senior Web Application Engineer, J.League Online Store - EC Expansion Development Department (ECEXD)