Стек вызовов(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
Код выше будет выполнен следующим образом:
- Игнорирование всех функций, пока не будет достигнуто место вызова функции
greeting()
. - Вызывается функция
greeting().
- Функция "greeting" помещается в очередь стека вызовов.
Очередь стека вызовов:
- greeting
- Выполняется код внутри функции `greeting`.
- Вызывается функция
sayHi()
. - Функция
sayHi()
помещается в очередь стека вызовов.
Очередь стека вызовов:
- greeting
- sayHi
- Выполняется весь код внутри функции
sayHi()
до самого конца. - Возврат выполнения кода с места вызова функции
sayHi()
и продолжение выполнения оставшегося кода функцииgreeting()
. - Выполненная функция
sayHi()
удаляется из очереди стека вызовов.
Очередь стека вызовов:
- greeting - Когда весь код внутри функции
greeting()
выполнен, происходит возврат выполнения оставшейся части основного скрипта JS с места вызова функцииgreeting()
. - Выполненная функция
greeting()
удаляется из очереди стека вызовов.
Очередь стека вызовов:
ПУСТО
Выполнение кода началось с пустого стека вызовов, и всякий раз, когда мы вызывали функцию, она автоматически добавлялась в очередь стека вызовов, после выполнения всего своего кода она автоматически удалялась из очереди стека вызовов. И в конце выполнение кода также завершилось с пустым стеком вызовов.
Узнать больше
Общие знания
- Call stack on Wikipedia