Стек вызовов — это временное хранилище в памяти, используемое для хранения потока выполнения функций для программ. Это структура данных стека, поэтому она имеет две основные операции; push(чтобы добавить активную функцию в хранилище) и pop(чтобы удалить функцию после выполнения).
Стек представляет собой структуру данных LIFO (последний пришел, первый вышел); подумайте об этом как о способе складывать тарелки, где вы выбираете блюда, добавленные последними.
Давайте рассмотрим, как код javascript будет выполнять приведенный выше код и как поможет стек вызовов.
1.function solve(a, b) { 2. var sqr_a = square(a); 3. return sqr_a + b; 4.} 5. 6.function square(val) { 7. return val * val; 8.} 9. 10.function main() { 11. var c = solve(3, 5); 12. console.log(a) 13.} 14. 15.main()
- Движок Javascript читает код сверху.
Движок javascript — это программное обеспечение, которое запускает код javascript.
- Он распознает объявление функции для решения() в строке 1 и сохраняет всю функцию в памяти.
- То же самое происходит для квадрата функции и главного
- Когда он доходит до последней строки, он распознает вызов функции
Вызов или вызов функции — это просто вызов имени функции с круглыми скобками
()
; это указывает на то, что функция должна начать выполнение.
- Для функции создается
stack frame
и добавляется на вершину стека.
Фрейм стека состоит из информации о функции, таких данных, как параметры, локальные переменные и точка возврата функции.
Адрес возврата в кадрах стека в стеке вызовов указывает точное место, где программа должна возобновить выполнение после того, как функция завершит свои задачи.
- Затем стек вызовов запускает функцию для функции main().
- Строка 11 вызывает функциюsolve(); поэтому создается еще один кадр стека, который помещается на вершину стека.
- Затем начинает выполняться функцияsolve().
- Строка 2 вызывает Square(), а также создается стек вызовов и помещается в верхнюю часть стека.
- На данный момент наш стек выглядит примерно так
callStack = [stackFrame(основной), stackFrame(решить), stackFrame(квадратный)
- Функция Square не вызывает никаких новых функций, но завершает выполнение после операции умножения.
- Как только кадр стека для Square() завершает свое выполнение, стек вызовов удаляет его, а затем кадр стека для решения() продолжает выполнение.
- Как только выполнение кадра стека дляsolve() также завершено, стек вызовов удаляет его, а функция main() продолжает свое выполнение.
- После присвоения значения 14 переменной «a» в строке 11 происходит вызов функции console.log(), также создающей кадр стека.
callStack = [stackFrame(основной), stackFrame(console.log)
- После отображения результата на консоли функция журнала удаляет связанный с ним кадр стека. В этот момент функция main() завершает свое выполнение, что также приводит к удалению ее фрейма стека.
- Итак, программа выполнена.