JavaScript Core

Execution Context, Event Loop, closures и ключевые интервью-ловушки.

Почему этот блок важен на собеседовании

На техническом интервью по JavaScript чаще всего проваливают не синтаксис, а объяснение модели выполнения кода. Интервьюеру важно услышать:

  • как создаются execution context;
  • как работает call stack;
  • почему Promise и setTimeout выполняются в разном порядке;
  • как замыкания удерживают состояние.

Если ты умеешь это проговорить простым языком и без противоречий, остальные вопросы обычно становятся заметно проще.

Execution Context и Call Stack

Каждый вызов функции создает новый execution context и кладется в call stack. Пока верхний контекст не завершен, следующий шаг не начнется.

Удобно держать в голове две фазы:

  1. Creation phase:
    • выделяются переменные;
    • поднимаются (hoisting) объявления функций;
    • связывается this.
  2. Execution phase:
    • идут реальные вычисления;
    • значения присваиваются уже по месту выполнения.

Типичный вопрос интервьюера: почему функция доступна до строки объявления, а const — нет. Ответ: из-за различий в hoisting и temporal dead zone.

Event Loop: microtasks и macrotasks

После завершения синхронного кода движок сначала очищает очередь microtasks (Promise.then, queueMicrotask), и только потом берет следующую macrotask (setTimeout, setInterval, I/O callbacks).

Это объясняет, почему “нулевой таймаут” не означает мгновенное выполнение.

True/FalseInline

Event Loop: базовая проверка

Верно ли утверждение про приоритет microtasks?

Колбэки Promise выполняются перед setTimeout(0).

console.log("A");
setTimeout(() => console.log("B"), 0);
Promise.resolve().then(() => console.log("C"));
console.log("D");

Порядок будет: A -> D -> C -> B.

Интервью-ловушка: цепочки Promise.then(...).then(...) могут “задерживать” следующие macrotasks, если microtasks очень много.

Multiple ChoiceInline

Call Stack и очереди

Что из перечисленного относится к microtasks?

Варианты ответа
Order StepsInline

Порядок выполнения в Event Loop

Расположи шаги в корректной последовательности.

  1. 1.Запускается следующая macrotask
  2. 2.Очищается очередь microtasks
  3. 3.Выполняется синхронный код текущей задачи

Перетаскивай шаги за ручку ⋮⋮ или используй кнопки ↑/↓.

Замыкания и область видимости

Замыкание — это функция, которая “помнит” лексическое окружение. На интервью часто проверяют, понимаешь ли ты, что переменная из внешней функции остается доступной даже после завершения этой внешней функции.

function createCounter() {
  let count = 0;
  return () => ++count;
}

const inc = createCounter();
console.log(inc()); // 1
console.log(inc()); // 2

Важная практическая ошибка: использование var в цикле с асинхронными callback. Все callback могут получить одно и то же конечное значение индекса. let или замыкание через фабричную функцию решают проблему.

Fill The BlankInline

Замыкания и область видимости

Вставь ключевые термины про lexical scope.

Функция, которая использует переменную из внешней области видимости после завершения внешней функции, называется . Это поведение основано на .

Мини-итог

К концу этого блока ты должен уметь кратко проговорить:

  • как формируется стек вызовов;
  • почему Promise-колбэки выполняются раньше setTimeout(0);
  • как замыкания помогают хранить состояние без глобальных переменных.
  • какие ошибки чаще всего происходят при работе с hoisting и циклами.