Ereigniswarteschlange und Aufrufliste in Javascript verstehen

Meine Neugier, das Konzept von "Event Queue" und "Call Stack" zu verstehen. Begonnen, als ich diese Frage löste:

var list = readHugeList();

var nextListItem = function() {
    var item = list.pop();

    if (item) {
        // process the list item...
        nextListItem();
    }
};

Der folgende rekursive Code führt zu einem Stapelüberlauf, wenn die Array-Liste zu groß ist. Wie können Sie dies beheben und trotzdem das rekursive Muster beibehalten?

ie Lösung, die erwähnt wurde, war dies

var list = readHugeList();

var nextListItem = function() {
    var item = list.pop();

    if (item) {
        // process the list item...
        setTimeout( nextListItem, 0);
    }
};

Lösung

Der Stapelüberlauf wird beseitigt, da die Ereignisschleife die Rekursion und nicht den Aufrufstapel behandelt. Wenn nextListItem ausgeführt wird und item nicht null ist, wird die Zeitüberschreitungsfunktion (nextListItem) in die Ereigniswarteschlange gestellt und die Funktion wird beendet, wodurch die Aufrufliste leer bleibt. Wenn die Ereigniswarteschlange ihr Zeitüberschreitungsereignis ausführt, wird das nächste Element verarbeitet und ein Zeitgeber so eingestellt, dass nextListItem erneut aufgerufen wird. Dementsprechend wird die Methode von Anfang bis Ende ohne direkten rekursiven Aufruf verarbeitet, sodass der Aufrufstapel unabhängig von der Anzahl der Iterationen übersichtlich bleibt.

Jetzt meine Frage:

Q1) Was ist der Unterschied zwischen "Event Queue" und "Call Stack"

Q2) Ich habe die Antwort nicht verstanden. Kann mir jemand das genau erklären?

Q3)Wenn ich eine Funktion ausführe oder eine Variable oder ein Objekt in Javascript aufrufe. Wie geht der Fluss? Was geht in der Aufrufliste? (Sagen wir, ich mache setTimeout. Geht es in die Callstack- oder Event-Warteschlange?)

Diese Konzepte sind sehr unklar. Ich habe gegoogelt, aber die meisten Ergebnisse entsprechen nicht meinen Erwartungen.

Bitte hilfe!

Antworten auf die Frage(4)

Ihre Antwort auf die Frage