Execution context и call stack
↑ 2.1 JavaScript: продвинутый · → Следующая
Зачем это на собесе
Основа для понимания hoisting, замыканий,
thisи ошибок «Maximum call stack size exceeded».
Объяснение
Execution context (EC) — среда, в которой выполняется код. Виды: глобальный, функциональный, eval.
Создание контекста в две фазы:
- Creation: создаётся Lexical Environment (переменные, объявления функций), определяется
this, подготавливается ссылка на внешнее окружение (scope chain).varинициализируютсяundefined,let/const— в TDZ, function declarations — целиком. - Execution: выполнение кода построчно, присвоение значений.
Call stack — стек контекстов: вызов функции кладёт контекст, возврат снимает. Единственный поток — один стек, поэтому синхронный тяжёлый код блокирует страницу.
function a() { b(); }
function b() { c(); }
function c() { console.trace(); }
a();
// стек: global → a → b → cРекурсия без базового случая: RangeError: Maximum call stack size exceeded. JS не гарантирует оптимизацию хвостовой рекурсии (реализована только в Safari).
Свойства:
| Понятие | Смысл |
|---|---|
| Lexical Environment | таблица привязок + ссылка на внешнее окружение |
| Scope chain | цепочка окружений для поиска переменных |
this binding | определяется при вызове (см. this, call, apply, bind, стрелочные функции) |
| Heap | память для объектов |
| Call stack | порядок вызовов; хранит примитивы и ссылки |
Асинхронный код не блокирует стек благодаря очереди задач и event loop (см. Event Loop: микро- и макрозадачи).
Нюансы и подводные камни
- Глубокая рекурсия (обход большого дерева) → итеративный алгоритм с явным стеком.
- Долгие синхронные функции блокируют рендер и события.
- Ошибки содержат stack trace — читайте его снизу вверх.
- Замыкания хранят окружение в куче, а не в стеке.
Практика
- Нарисуйте call stack для цепочки вызовов и запишите порядок создания/удаления контекстов.
- Вызовите переполнение стека и перепишите рекурсию в цикл.
- Найдите блокирующую функцию в Performance.
Вопросы с ответами
Что такое call stack?
Стек активных контекстов выполнения; последний вызванный возвращает первым.
Что происходит на фазе creation?
Создаются привязки переменных и функций, определяется
thisи scope chain до выполнения кода.