Кадр стека: что движок хранит для вызова
Аргументы, локальные значения и место возврата у каждого вызова свои.
В предыдущем уроке мы рассмотрели Call Stack — стек вызовов. Каждая запись в нём должна помогать движку продолжить конкретный вызов: помнить его данные и куда вернуть управление.
Рассмотрим два вызова одной функции:
function double(value) {
const result = value * 2;
return result;
}
const first = double(3);
const second = double(8);
- При
double(3)движку нужны значенияvalue = 3иresult = 6. Послеreturnчисло6попадёт вfirst. - Первый вызов завершается, его кадр снимается со стека.
- Вызов
double(8)получает свой кадр: теперьvalue = 8,result = 16, а результат нужно вернуть вsecond.
- Аргумент
value = 3- Локальное значение
result = 6- Куда вернуть результат
- В присваивание
first
return 6После возврата: first = 6- Аргумент
value = 8- Локальное значение
result = 16- Куда вернуть результат
- В присваивание
second
return 16После возврата: second = 16При вложенных вызовах кадр вызывающей функции остаётся в стеке, пока выполняется вызванная. Благодаря этому после return движок может продолжить предыдущую функцию с её данными. Это работает и при рекурсии, когда функция вызывает саму себя.
Спецификация описывает состояние выполнения через контексты исполнения. Кадры стека — способ организовать это состояние внутри движка.