Call-Stack
Ein Call-Stack ist ein Mechanismus für einen Interpreter (wie den JavaScript-Interpreter in einem Webbrowser), um seine Position in einem Skript nachzuverfolgen, das mehrere Funktionen aufruft — welche Funktion derzeit ausgeführt wird und welche Funktionen innerhalb dieser Funktion aufgerufen werden, usw.
- Wenn ein Skript eine Funktion aufruft, fügt der Interpreter sie dem Call-Stack hinzu und beginnt dann mit der Ausführung der Funktion.
- Alle Funktionen, die von dieser Funktion aufgerufen werden, werden weiter oben im Call-Stack hinzugefügt und dort ausgeführt, wo ihre Aufrufe erreicht werden.
- Wenn die aktuelle Funktion abgeschlossen ist, nimmt der Interpreter sie vom Stack und setzt die Ausführung an der Stelle fort, an der sie in der letzten Codeauflistung unterbrochen wurde.
- Wenn der Stack mehr Speicherplatz einnimmt, als ihm zugewiesen wurde, wird ein "Stack-Overflow"-Fehler ausgelöst.
Beispiel
function greeting() {
// [1] Some code here
sayHi();
// [2] Some code here
}
function sayHi() {
return "Hi!";
}
// Invoke the `greeting` function
greeting();
// [3] Some code here
Der Call-Stack wird zu Beginn leer sein und der obige Code würde so ausgeführt werden:
-
Ignorieren Sie alle Funktionen, bis der
greeting()
Funktionsaufruf erreicht wird. -
Fügen Sie die
greeting()
Funktion zur Call-Stack-Liste hinzu, und wir haben:- greeting
-
Führen Sie alle Zeilen des Codes innerhalb der
greeting()
Funktion aus. -
Gehe zum
sayHi()
Funktionsaufruf. -
Fügen Sie die
sayHi()
Funktion zur Call-Stack-Liste hinzu, wie:- sayHi - greeting
-
Führen Sie alle Zeilen des Codes innerhalb der
sayHi()
Funktion aus, bis deren Ende erreicht ist. -
Geben Sie die Ausführung an die Zeile zurück, die
sayHi()
aufgerufen hat, und setzen Sie die restlichegreeting()
Funktion fort. -
Löschen Sie die
sayHi()
Funktion aus unserer Call-Stack-Liste. Nun sieht der Call-Stack so aus:- greeting
-
Wenn alles innerhalb der
greeting()
Funktion ausgeführt wurde, kehren Sie zur aufrufenden Zeile zurück, um den Rest des JS-Codes auszuführen. -
Löschen Sie die
greeting()
Funktion aus der Call-Stack-Liste. Erneut wird der Call-Stack leer.
Zusammenfassend beginnen wir also mit einem leeren Call-Stack. Immer wenn wir eine Funktion aufrufen, wird sie automatisch dem Call-Stack hinzugefügt. Sobald die Funktion ihren gesamten Code ausgeführt hat, wird sie automatisch aus dem Call-Stack entfernt. Letztendlich ist der Stack wieder leer.
Siehe auch
- Call-Stack auf Wikipedia
- Verwandte Glossarbegriffe: