Call stack

Стек вызовов (call stack) - это механизм для интерпретаторов (таких как интерпретатор JavaScript в веб-браузере) для отслеживания текущего местонахождения интерпретатора в скрипте, который вызывает несколько функций, — какая из функций выполняется на данный момент, какие функции вызываются изнутри этой (выполняемой) функции, какая будет вызвана следующей и т. д.

  • Когда скрипт вызывает функцию, интерпретатор добавляет её в стек вызовов и потом начинает её обработку.
  • Любые функции, вызванные этой функцией, добавляются в стек вызовов и выполняются, как только происходит их вызов.
  • Когда выполнение основной функции завершено, интерпретатор снимает её со стека вызовов и возобновляет выполнение кода в списке основного кода с той точки, где остановился до этого.
  • Если стек занимает больше места, чем ему было присвоено, это приводит к ошибке переполнения стека ("stack overflow" error).

Пример

js
function greeting() {
  // [1] Some code here
  sayHi();
  // [2] Some code here
}
function sayHi() {
  return "Hi!";
}

// Invoke the `greeting` function
greeting();

// [3] Some code here

Код выше будет выполнен следующим образом:

  1. Игнорирование всех функций, пока не будет достигнуто место вызова функции greeting().
  2. Вызывается функция greeting().
  3. Функция "greeting" помещается в очередь стека вызовов.

    Примечание: Очередь стека вызовов: - greeting

  4. Выполняется код внутри функции greeting.
  5. Вызывается функция sayHi().
  6. Функция sayHi() помещается в очередь стека вызовов.

    Примечание: Очередь стека вызовов: - greeting - sayHi

  7. Выполняется весь код внутри функции sayHi() до самого конца.
  8. Возврат выполнения кода с места вызова функции sayHi() и продолжение выполнения оставшегося кода функции greeting().
  9. Выполненная функция sayHi() удаляется из очереди стека вызовов.

    Примечание: Очередь стека вызовов: - greeting

  10. Когда весь код внутри функции greeting() выполнен, происходит возврат выполнения оставшейся части основного скрипта JS с места вызова функции greeting().
  11. Выполненная функция greeting() удаляется из очереди стека вызовов.

    Примечание: Очередь стека вызовов: ПУСТО

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