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

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

Пример

 

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

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

// [3] Some codes here

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

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

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

 

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

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

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

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

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

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

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

Узнать больше

Общие знания

Метки документа и участники

Внесли вклад в эту страницу: Dimas-X, Iroshh
Обновлялась последний раз: Dimas-X,