765 Stimmen

Fehler beim Überschreiten der maximalen Aufrufstapelgröße

Ich verwende eine Direct Web Remoting (DWR) JavaScript-Bibliotheksdatei und erhalte nur in Safari (Desktop und iPad) einen Fehler

Dort heißt es

Maximale Größe des Aufrufstapels überschritten.

Was genau bedeutet dieser Fehler, und wird die Verarbeitung vollständig abgebrochen?

Auch eine Lösung für Safari Browser (eigentlich auf der iPad Safari heißt es

JS:execution exceeded timeout

Ich nehme an, dass es sich dabei um dasselbe Problem mit dem Aufrufstapel handelt.)

4 Stimmen

Ich bekam diesen Fehler, als ich versuchte, Variablen (ohne sie zu deklarieren) zu senden, durch data in Ajax. Der Fehler wurde durch Deklaration der Variablen behoben.

0 Stimmen

Endlosschleife ...

0 Stimmen

Bei mir war der Name meiner JavaScript-Funktion onclick() und ich bekam diesen Fehler :-) Dies sind zwar reservierte Namen

22voto

Nate Glenn Punkte 6074

In meinem Fall habe ich ein großes Byte-Array in eine Zeichenkette konvertiert, indem ich Folgendes verwendet habe:

String.fromCharCode.apply(null, new Uint16Array(bytes))

bytes enthielt mehrere Millionen Einträge, was zu groß ist, um auf den Stapel zu passen.

0 Stimmen

Auch ich hatte das gleiche Problem mit der gleichen Zeile!! danke

0 Stimmen

Was ist also die beste Lösung für die Konvertierung großer Byte-Arrays?

11 Stimmen

@KarthikHande Sie müssen es in einer for-Schleife statt in einem einzigen Aufruf tun. var uintArray = new Uint16Array(bytes); var converted = []; uintArray.forEach(function(byte) {converted.push(String.fromCharCode(byte))});

12voto

bendytree Punkte 12194

Dies kann auch zu einer Maximum call stack size exceeded Fehler:

var items = [];
[].push.apply(items, new Array(1000000)); //Bad

Das gilt auch für mich:

items.push(...new Array(1000000)); //Bad

Desde el Mozilla-Dokumente :

Aber Vorsicht: Wenn Sie apply auf diese Weise verwenden, laufen Sie Gefahr, die JavaScript-Engine die Längenbegrenzung für Argumente zu überschreiten. Die Folgen von Anwendung einer Funktion mit zu vielen Argumenten (mehr als zehntausend Argumente) tausende von Argumenten) sind je nach Engine unterschiedlich (JavaScriptCore hat hart kodierte Argumentgrenze von 65536), da die Grenze (ja sogar die Art des Verhaltens bei zu großen Stapeln) nicht spezifiziert ist. Einige Engines werden eine Ausnahme auslösen. Noch schlimmer ist, dass andere willkürlich die Anzahl der Argumente begrenzen, die tatsächlich an die angewandte Funktion. Zur Veranschaulichung des letzteren Falls: Wenn eine solche Engine eine Grenze von vier Argumenten hätte (die tatsächlichen Grenzen sind natürlich wesentlich höher), wäre es so, als wären die Argumente 5, 6, 2, 3 an apply in den obigen Beispielen übergeben worden wären, statt der gesamten Array.

Versuchen Sie es also:

var items = [];
var newItems = new Array(1000000);
for(var i = 0; i < newItems.length; i++){
  items.push(newItems[i]);
}

0 Stimmen

Dies ist eine sehr schlechte Praxis beim Einfügen von Knoten in den Dom, aber Sie haben vielleicht Recht... el.append(...divs) nach der Schleife verursacht diesen Fehler, wenn Sie genügend Knoten haben.

8voto

Shahdat Punkte 5094

In meinem Fall wurde Klick-Ereignis auf Kind-Element propagieren. Also, ich musste das folgende setzen:

e.stopPropagation()

beim Klick-Ereignis:

 $(document).on("click", ".remove-discount-button", function (e) {
           e.stopPropagation();
           //some code
        });
 $(document).on("click", ".current-code", function () {
     $('.remove-discount-button').trigger("click");
 });

Hier ist der HTML-Code:

 <div class="current-code">                                      
      <input type="submit" name="removediscountcouponcode" value="
title="Remove" class="remove-discount-button">
   </div>

6voto

Nandostyle Punkte 156

In meinem Fall lag es daran, dass ich 2 Variablen mit demselben Namen habe!

5voto

El_boogy Punkte 91

Das Senden von Eingabeelementen anstelle ihrer Werte wird das Problem höchstwahrscheinlich lösen, wie FK erwähnte

0 Stimmen

Das war mein Problem facepalm Ich habe vergessen, den Wert zu senden, stattdessen habe ich das ganze Element an meine Ajax-Funktion gesendet

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X