2013-07-29 10 views
5

Wie der Titel, warum die requestAnimationFrame Rekursion nicht RAM auffressen wird. Dieser post sagte, dass der V8-Motor keine Optimierung für die tail call hat, also denke ich, dass ich etwas verpasst haben muss. Ist das, weil der Browser etwas dahinter getan hat? Oder unterstützt der V8 die Optimierung von tail call?Warum "requestAnimationFrame" Rekursion wird nicht RAM auffressen?

Hier ist die MDN des example:

function step(timestamp) { 
    var progress = timestamp - start; 
    d.style.left = Math.min(progress/10, 200) + "px"; 
    if (progress < 2000) { 
    requestAnimationFrame(step); 
    } 
} 

requestAnimationFrame(step); 

Antwort

9

requestAnimationFrame den Browser darüber informiert, dass er will die Callback-Funktion so schnell ausgeführt werden, da ein Rahmen zeichnen muss. Die Schließung der Funktion muss gespeichert werden, bis der Rückruf erfolgt, aber danach kann es Müll gesammelt werden, vorausgesetzt, es wird nicht anderswo referenziert.

Hier gibt es keine Rekursion, da wir über eine Ereignisschleife die Ausführung abbrechen. Die Funktion ruft sich selbst nicht an, sie fordert, aufgerufen zu werden. Jedes Mal, wenn die Ausführung beendet ist, kann dieses RAM-Bit zurückgewonnen werden.

Es lohnt sich daran zu denken, dass, wenn step einfach sich selbst genannt würde, das eine unendliche Rekursion wäre. In diesem Fall würde der Stapel explodieren. Wenn wir uns einen unendlichen Stapel vorstellen, der nicht in die Luft gehen kann (oder eine Rekursion mit einem Tail-Aufruf), blockiert er die Ereignisschleife und verhindert, dass anderer Code ausgeführt wird, da nur eine Funktion gleichzeitig ausgeführt werden kann.

+1

Ausgezeichnete Wortwahl, Kumpel! –

Verwandte Themen