Stos wykonania (wywołania): Javascript

Jan 27 2023
Wykonanie lub stos wywołań to mechanizm struktury danych. Mechanizm ten zapewnia, że ​​konteksty wykonania są wykonywane w określonej kolejności.

Wykonanie lub stos wywołań to mechanizm struktury danych. Mechanizm ten zapewnia, że ​​konteksty wykonania są wykonywane w określonej kolejności.

Wyjaśniłem, czym jest kontekst wykonania w poprzednim artykule, możesz sprawdzić ten artykuł , aby lepiej zrozumieć ten mechanizm.

Możemy myśleć o stosie wykonania (wywołania) jako o miejscu, w którym po kolei gromadzone są zadania do wykonania. Ale ponieważ kolejka tutaj działa zgodnie z algorytmem LIFO (ostatnie weszło, pierwsze wyszło) , ostatnie zaakceptowane zadanie jest wykonywane jako pierwsze. Tymczasem zadanie odnosi się do globalnych i funkcjonalnych kontekstów wykonania.

Kiedy silnik JS odczytuje kod, najpierw umieszcza kontekst globalny w kolejce, zapisując go na stosie wywołań i rozpoczyna wykonywanie. Później, jeśli w trakcie procesu zostanie wywołana jakakolwiek funkcja, tworzony jest kontekst tej funkcji, dodawany do stosu wywołań i uruchamiane jest wykonanie tej funkcji w sposób LIFO.

Proces wykonywania stosu wywołań

Załóżmy, że istnieje szpital i jest to Call stack . W szpitalu wykonywane są operacje ratujące i leczące ludzkie życie. Przede wszystkim potrzebni są do tego lekarze i zaopatrzenie. Możemy myśleć o sprowadzeniu tam lekarzy i zaopatrzenia oraz o tym, co robią, jako o pisaniu i wykonywaniu globalnego kontekstu na stosie wywołań. Pomyślmy o pacjencie X jako o kontekście funkcjonalnym lub nowym zadaniu. Pacjent, który trafia do szpitala, wpisuje się na listę oczekujących i natychmiast rozpoczyna leczenie. Tego dnia pacjent Y (nowy przydział) zostaje przewieziony do szpitala w poważniejszym stanie. Ponieważ stan Y jest poważny, Xleczenie jest chwilowo opóźnione i zaczynają zajmować się Y bez marnowania czasu. Po leczeniu Y kontynuują leczenie X od miejsca, w którym je przerwali.

Spójrzmy na to wszystko w kodzie.

W powyższym kodzie stos wywołań kontekstu globalnego będzie wykonywany do momentu wywołania funkcji getResult w linii 14.

Następnie, gdy tylko zostanie wywołana funkcja getResult , kontekst funkcjonalny tej funkcji zostanie utworzony i wysłany do stosu wywołań w celu wykonania.

Po odczytaniu 10. linii w getResult zostanie wywołana funkcja mnożenia , w ten sam sposób zostanie utworzony kontekst, który zostanie dodany do stosu wywołań i wykonany.

Zostanie usunięty ze stosu wywołań, gdy tylko funkcja mnożenia zostanie zakończona. Następnie stos wywołań będzie kontynuowany od miejsca, w którym został przerwany, do kontekstu getResult .

Oznacza to, że następny przejdzie do linii 11. Ta linia wywoła funkcję getSquareValue . Ponownie, kontekst zostanie utworzony w ten sam sposób i zostanie wykonany w stosie wywołań.

Gdy tylko getSquareValue zostanie wykonane, zostanie usunięte ze stosu wywołań i zwrócone do getResult .

Po tym miejscu, w 12. linii, ponieważ kontekst getResult jest już zamknięty, wykonanie tego zadania zostanie zakończone i zostanie zdjęte ze stosu wywołań.

Po wykonaniu całego kontekstu funkcjonalnego, czyli zadań, kontekst globalny zakończy swoją pracę, a nasz stos wywołań zostanie opróżniony.

Takie sekwencyjne wykonywanie zadań ze stosu wywołań daje nam synchroniczny proces wykonywania. Mechanizmowi działania funkcji asynchronicznych (setTimeout, setInterval, setImmediate) przyjrzymy się w następnym artykule.

Dziękuję za przeczytanie. :)

Inne tematy: