Heim  >  Artikel  >  Web-Frontend  >  Informationen zur Berechnungsmethode für die Stapelgröße des JS-Funktionsaufrufs

Informationen zur Berechnungsmethode für die Stapelgröße des JS-Funktionsaufrufs

不言
不言Original
2018-06-29 10:35:532641Durchsuche

Dieser Artikel teilt Ihnen relevante Wissenspunkte über die Berechnungsmethode für die Stapelgröße von JS-Funktionsaufrufen mit. Interessierte Freunde können sich als Referenz darauf beziehen.

Wenn Sie eine Endlosschleife schreiben, die sich ständig selbst aufruft, herzlichen Glückwunsch, werden Sie bald einen Fehler sehen: Uncaught RangeError: Maximale Aufrufstapelgröße überschritten. Wie groß ist also der Aufrufstapel?

1. Berechnungsmethode

Die folgende Methode kann für Sie berechnen, wie tief der Aufruf von der von Ihnen verwendeten JavaScript-Engine unterstützt werden kann (inspiriert durch einen Code). von Ben Alman):

function computeMaxCallStackSize() {
    try {
      return 1 + computeMaxCallStackSize();
    } catch (e) {
      // Call stack overflow
      return 1;
    }
  }

wird ausgeführt und erhält die folgenden drei Ergebnisse:

  • Node.js: 11034

  • Firefox: 50994

  • Chrome: 10402

Was bedeuten diese Zahlen? Herr Aleph sagte mir, dass in V8 die Anzahl der aufrufbaren Schichten auf zwei Aspekten basiert: 1. der Größe des Stapels; 2. der Größe jedes Stapelrahmens (der zum Aufzeichnen von Funktionsparametern und lokalen Variablen verwendet wird). Sie können zum Testen eine lokale Variable in „computeMaxCallStackSize“ deklarieren und werden feststellen, dass die Zahl kleiner wird.

2. Tail-Rekursionsoptimierung in ECMAScript 6

ECMAScript 6 unterstützt Tail-Rekursionsoptimierung: Wenn die letzte Operation einer Funktion ein Funktionsaufruf ist, wird „jump“ ausgeführt anstelle von „Unteraufruf“ verwendet werden. Mit anderen Worten: Wenn Sie „computeMaxCallStackSize“ in die folgende Form umschreiben, wird es immer im strengen ES6-Modus ausgeführt.

function computeMaxCallStackSize(size) {
    size = size || 1;
    return computeMaxCallStackSize(size + 1);
  }

3. Kommentare hervorheben

Andrei: Die „ECMAScript 6“-Version des Codes funktioniert einfach nicht arbeiten. Obwohl die Größe geändert wird, wird am Ende kein Wert zurückgegeben.

Antwort an Andrei: Interessant! Sie können diesen Code nicht zur Berechnung der Stapelgröße verwenden. Unter ES6 wird dieser Code ewig ausgeführt, sodass keine Daten zurückgegeben werden. In anderen Fällen wird RangeError zurückgegeben. Damit es funktioniert, habe ich den Code umgeschrieben:

var computeMaxCallStackSize = (function() {
 return function() {
  var size = 0;
  function cs() {
   try {
    size++;
    return cs();
   } catch(e) {
    return size + 1;
   }
  }
  return cs();
 };
}());

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er zum Lernen aller beiträgt , mehr Bitte beachten Sie die chinesische PHP-Website für verwandte Inhalte!

Verwandte Empfehlungen:

jQuery implementiert das Abrufen dynamisch hinzugefügter Etikettenobjekte

So erhalten Sie Daten in Javascript im WeChat-Applet

So ermitteln Sie, ob der Iframe über JS geladen wird

Das obige ist der detaillierte Inhalt vonInformationen zur Berechnungsmethode für die Stapelgröße des JS-Funktionsaufrufs. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn