Sind Sie neugierig, wie viele rekursive Anrufe von der JavaScript -Engine getätigt werden können?
Wie viele rekursive Anrufe
Mit der folgenden Funktion können Sie die Antwort finden: (inspiriert von Ben Almans Gist)
Die Codekopie lautet wie folgt:
Funktion ComputMaxCallStacksize () {
versuchen {
return 1 + computeremaxcallStacksize ();
} catch (e) {
// Stapelüberlauf rufen
Rückkehr 1;
}
}
Drei Ergebnisse:
Die Codekopie lautet wie folgt:
Node.js: 11034
Firefox: 50994
Chrom: 10402
Was repräsentieren diese Zahlen? Herr Aleph wies darauf hin, dass in V8 die Anzahl der rekursiven Anrufe von zwei Mengen abhängt: die Größe des Stapels und die Größe des Stapelrahmens (die lokale Variable, die die Parameter enthält). Sie können dies überprüfen, indem Sie lokale Variablen in ComputMaxCallStackSize () hinzufügen - einen niedrigen Wert zurückgibt.
Schwanzaufrufoptimierung in ECMascript 6
ES6 hat eine Heckanrufoptimierung: Wenn der letzte Schritt in einer Funktion auch ein Funktionsaufruf ist, wird er "springen", anstatt von einer Unterfunktion aufgerufen zu werden. Dies bedeutet, dass Sie in ES6 (Strict -Modus) nur die ComputMaxCallStackSize -Funktion ein wenig ändern müssen und für immer ausgeführt werden können.
Die Codekopie lautet wie folgt:
Funktion ComputMaxCallStacksize (Größe) {
Größe = Größe || 1;
return ComputMaxCallStacksize (Größe + 1);
}