Call stack
Стек вызовов (call stack) - это механизм для интерпретаторов (таких как интерпретатор JavaScript в веб-браузере) для отслеживания текущего местонахождения интерпретатора в скрипте, который вызывает несколько функций, — какая из функций выполняется на данный момент, какие функции вызываются изнутри этой (выполняемой) функции, какая будет вызвана следующей и т. д.
- Когда скрипт вызывает функцию, интерпретатор добавляет её в стек вызовов и потом начинает её обработку.
- Любые функции, вызванные этой функцией, добавляются в стек вызовов и выполняются, как только происходит их вызов.
- Когда выполнение основной функции завершено, интерпретатор снимает её со стека вызовов и возобновляет выполнение кода в списке основного кода с той точки, где остановился до этого.
- Если стек занимает больше места, чем ему было присвоено, это приводит к ошибке переполнения стека ("stack overflow" error).
Пример
function greeting() {
// [1] Some code here
sayHi();
// [2] Some code here
}
function sayHi() {
return "Hi!";
}
// Invoke the `greeting` function
greeting();
// [3] Some code here
Код выше будет выполнен следующим образом:
-
Игнорирование всех функций, пока не будет достигнуто место вызова функции
greeting()
. -
Вызывается функция
greeting().
-
Функция "greeting" помещается в очередь стека вызовов.
Примечание: Очередь стека вызовов: - greeting
-
Выполняется код внутри функции
greeting
. -
Вызывается функция
sayHi()
. -
Функция
sayHi()
помещается в очередь стека вызовов.Примечание: Очередь стека вызовов: - greeting - sayHi
-
Выполняется весь код внутри функции
sayHi()
до самого конца. -
Возврат выполнения кода с места вызова функции
sayHi()
и продолжение выполнения оставшегося кода функцииgreeting()
. -
Выполненная функция
sayHi()
удаляется из очереди стека вызовов.Примечание: Очередь стека вызовов: - greeting
-
Когда весь код внутри функции
greeting()
выполнен, происходит возврат выполнения оставшейся части основного скрипта JS с места вызова функцииgreeting()
. -
Выполненная функция
greeting()
удаляется из очереди стека вызовов.Примечание: Очередь стека вызовов: ПУСТО
Выполнение кода началось с пустого стека вызовов, и всякий раз, когда мы вызывали функцию, она автоматически добавлялась в очередь стека вызовов, после выполнения всего своего кода она автоматически удалялась из очереди стека вызовов. И в конце выполнение кода также завершилось с пустым стеком вызовов.