Erhöhen asynchrone Operationen mit Rückrufen die Stapelgröße? Ich habe nicht genug Wissen über Javascript-Interpreter oder die richtigen Werkzeuge, um dies herauszufinden. Mein Goto-Tool ist die Firebug-Konsole und es zeigt, dass die Stack-Größe nicht erhöht wird, aber ich könnte es falsch zu sehen. Weiß das jemand?
Antworten
Zu viele Anzeigen?Ein asynchroner Rückruf wird, genau wie ein Ereignisrückruf, nacheinander durch die Ereignisschleife ausgeführt. Er wird nicht aus dem gleichen Aufrufstapel der Funktion aufgerufen, die ihn in die Ereignisschleife gestellt hat, da jede Funktion in der Schleife bis zum Ende ausgeführt wird, bevor die nächste aufgerufen wird. Sie erhöhen also nicht die Stapelgröße.
Ich glaube, alle Javascript-Engines in modernen Browsern sind Single-Thread, was bedeutet, dass der Rückruf kann nicht tatsächlich auftreten, bis die aktuelle Ausführung Pfad beendet ist. Dies bedeutet, dass der Stapel vollständig abgewickelt hat und der Rückruf wird mit (im Wesentlichen) einen neuen Stapel auftreten.
Die Stackgröße erhöht sich nur, wenn Sie eine Funktion aufrufen oder eine lokale Variable deklarieren. Der Stack verkleinert sich wieder, wenn Sie den Bereich verlassen, der die Vergrößerung verursacht hat.
Wenn Sie sich mehr für den Gesamtspeicherverbrauch interessieren, ist die Sache etwas komplizierter.
Callbacks wird ein bisschen Speicher, bis sie ausgeführt werden, aber die Javascript-Engine sollte sauber nach sich selbst, sobald der Rückruf beendet ist. Wenn Sie neue Daten auf dem Heap (über globale Variablen, zum Beispiel) dann, dass der Speicher nicht freigegeben werden, weil es immer noch in Gebrauch sein, nachdem der Rückruf.