This page was translated from English by the community. Learn more and join the MDN Web Docs community.

View in English Always switch to English

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() удаляется из очереди стека вызовов.

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

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