Ich habe mit JavaScript herumgespielt, und ein Hinweis ein merkwürdiges Verhalten (seltsam für mich zumindest...)
Also habe ich eine SSCCE gemacht, hier geht es:
Ich habe ein div namens "myDiv"
%Vor%Live-Beispiel: Ссылка
Also ändere ich den Text im div und was passiert, ist, dass der Text von 9 auf 0 geht, während ich dachte, dass es von 0 bis 9 gehen sollte, da der rekursive changeText(counter);
-Aufruf vorher ist Aufruf der Methode, die den Text tatsächlich ändert.
Die Funktion enthält eine Zeitüberschreitung, die asynchron ist.
%Vor%Der Text wird geändert , bevor der rekursive Aufruf das Zeitlimit erreicht.
Wenn Sie möchten, können Sie den Druckaufruf von außerhalb des Zeitlimits verschieben, was das erwartete Verhalten als solches zur Folge hätte:
%Vor%(Beachten Sie jedoch, dass der Druck hier nicht zeitlich getrennt ist und wir uns auf ein undefiniertes Verhalten verlassen, wenn wir davon ausgehen, dass es zuerst gedruckt wird, nur weil wir den Timer zuerst setzen)
Wenn Sie möchten, dass es weiterhin in Verzögerungen druckt, können Sie die Funktion angeben. Die Rekursion wird immer noch zu Beginn durchgeführt, aber jedes Level wird dem Level darüber sagen, dass es getan ist:
%Vor%Streng genommen gibt es hier keine Rekursion .
Der Aufruf von setTimeout
fügt nur einen Rückruf zu einer Liste geplanter Timer-Ereignisse hinzu.
In vielen Fällen wartet Ihr Browser nur auf Ereignisse, verarbeitet diese (d. h. führt Ihre Ereignishandler aus) und kehrt dann zum Warten auf Ereignisse zurück.
In diesem Fall tun Sie also Folgendes:
%Vor% Ich nenne das pseudo-recursion , denn obwohl es etwas wie eine klassische Rekursion aussieht, beginnt jeder Aufruf im selben "Stack-Frame", dh wenn Sie nach einem Stack-Trace fragen würden eine (oder in Ihrem Fall manchmal zwei) Instanz von recursiveCall
gleichzeitig.
Eins zu verstehen ist, dass es überhaupt keine Rekursion ist; Wenn Ihre Funktion keine ordnungsgemäße Exit-Klausel hätte, könnte dies für immer so weitergehen, ohne in einen geblasenen Stack zu geraten.
Der Grund dafür ist, dass jede Funktion, die an setTimeout()
übergeben wird, außerhalb des aktuellen Ausführungskontexts ausgeführt wird. mit anderen Worten, der Code "bricht" von Ihrer Funktion.
Wenn Sie einen rekursiven Aufruf mit 750ms dazwischen haben möchten, könnten Sie so etwas tun:
%Vor%Erzeugt eine Kette von Rückrufen, wenn er rekursiv ist und die Exit-Klausel die gesamte Kettenbewegung rückwärts setzt:)
Tags und Links javascript