Стек вызовов — это временное хранилище в памяти, используемое для хранения потока выполнения функций для программ. Это структура данных стека, поэтому она имеет две основные операции; 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() завершает свое выполнение, что также приводит к удалению ее фрейма стека.
  • Итак, программа выполнена.