Почему этот блок важен на собеседовании
На техническом интервью по JavaScript чаще всего проваливают не синтаксис, а объяснение модели выполнения кода. Интервьюеру важно услышать:
- как создаются execution context;
- как работает call stack;
- почему
PromiseиsetTimeoutвыполняются в разном порядке; - как замыкания удерживают состояние.
Если ты умеешь это проговорить простым языком и без противоречий, остальные вопросы обычно становятся заметно проще.
Execution Context и Call Stack
Каждый вызов функции создает новый execution context и кладется в call stack. Пока верхний контекст не завершен, следующий шаг не начнется.
Удобно держать в голове две фазы:
- Creation phase:
- выделяются переменные;
- поднимаются (hoisting) объявления функций;
- связывается
this.
- Execution phase:
- идут реальные вычисления;
- значения присваиваются уже по месту выполнения.
Типичный вопрос интервьюера: почему функция доступна до строки объявления, а const — нет.
Ответ: из-за различий в hoisting и temporal dead zone.
Event Loop: microtasks и macrotasks
После завершения синхронного кода движок сначала очищает очередь microtasks
(Promise.then, queueMicrotask), и только потом берет следующую macrotask
(setTimeout, setInterval, I/O callbacks).
Это объясняет, почему “нулевой таймаут” не означает мгновенное выполнение.
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 очень много.
Call Stack и очереди
Что из перечисленного относится к microtasks?
Порядок выполнения в Event Loop
Расположи шаги в корректной последовательности.
- 1.Запускается следующая macrotask
- 2.Очищается очередь microtasks
- 3.Выполняется синхронный код текущей задачи
Перетаскивай шаги за ручку ⋮⋮ или используй кнопки ↑/↓.
Замыкания и область видимости
Замыкание — это функция, которая “помнит” лексическое окружение. На интервью часто проверяют, понимаешь ли ты, что переменная из внешней функции остается доступной даже после завершения этой внешней функции.
function createCounter() {
let count = 0;
return () => ++count;
}
const inc = createCounter();
console.log(inc()); // 1
console.log(inc()); // 2
Важная практическая ошибка: использование var в цикле с асинхронными callback.
Все callback могут получить одно и то же конечное значение индекса.
let или замыкание через фабричную функцию решают проблему.
Замыкания и область видимости
Вставь ключевые термины про lexical scope.
Функция, которая использует переменную из внешней области видимости после завершения внешней функции, называется . Это поведение основано на .
Мини-итог
К концу этого блока ты должен уметь кратко проговорить:
- как формируется стек вызовов;
- почему
Promise-колбэки выполняются раньшеsetTimeout(0); - как замыкания помогают хранить состояние без глобальных переменных.
- какие ошибки чаще всего происходят при работе с hoisting и циклами.