Вызов → возврат10 / 19

Call Stack: кто выполняется сейчас

Добавляем и снимаем кадры стека в правильном порядке.

Когда start() вызывает update(), выполнение start() ждёт возврата. Когда update() вызывает damage(), текущей становится damage(). После возврата управление идёт в обратном порядке.

function damage() { return 10; }
function update() { return damage(); }
function start() { return update(); }
start();

Это принцип LIFO: last in, first out. Стек помогает помнить, где продолжить выполнение после вложенного вызова. В ECMA-262 есть стек execution contexts; реальные машинные кадры V8 могут отличаться из-за inlining и других оптимизаций.

В симуляции script — условная нижняя граница выполняемого скрипта. С помощью кнопки «Следующее действие» проследим, как меняется верхний кадр. Здесь показан логический порядок вызовов, а не дамп нативного стека.

Если синхронный вызов долго не возвращается, следующий JS-callback на том же потоке сам по себе его не прервёт.

Порядок вызовов и возвратов

Проследим изменения верхнего кадра и соответствующей строки кода.

function damage() { return 10; }function update() { return damage(); }function start() { return update(); }start();
CALL STACK · ВЕРХ СВЕРХУ
scriptСейчас выполняется
РЕЗУЛЬТАТ—

Текущий скрипт готов вызвать start().

1 / 7
Основной вывод

Вложенный вызов выполняется раньше, чем продолжится вызвавшая его функция.

Проверить по первоисточнику ↗

ECMA-262 · Execution Contexts↗Контексты исполнения и их стек в спецификации.