Ein "too much recursion" - Fehler in Firefox nur manchmal?
Ich habe eine ziemlich einfache Sache, mache ich mit javascript und im Grunde nur manchmal wird javascript gebt mir ein "too much recursion" - Fehler.
Den code in Frage:
if(pageLoad===undefined){
var pageLoad=function(){};
}
var pageLoad_uniqueid_11=pageLoad;
var pageLoad=function(){
pageLoad_uniqueid_11();
pageLoad_uniqueid_12();
};
var pageLoad_uniqueid_12=function(){
alert('pageLoad');
};
$(document).ready(function(){
pageLoad();
});
(ja ich weiß, es gibt bessere Wege, dies zu tun. Das ist schwer zu ändern, obwohl, vor allem, weil der ASP.Net partielle postbacks, die nicht gezeigt).
Sowieso, wenn die zu viel Rekursion Fehler passiert, ist es weiterhin geschehen, bis ich Firefox neu starten. wenn ich Firefox neu starten, es funktioniert alles wieder normal. Wie kann ich dieses Problem beheben?
Ich habe aber auch einen jsbin-Beispiel
Update
Ok, ich habe herausgefunden, wie man zuverlässig reproduzieren es in unserem code, aber es funktioniert nicht für das jsbin-Beispiel. Wenn ich einen neuen tab und gehen Sie zu der gleichen Seite(zwei Tabletten die gleiche Adresse) und aktualisieren Sie dann die erste Registerkarte zwei mal, dann bekomme ich diese Fehler konsequent. Wir sind nicht mit jeder Art von session oder irgendetwas anderes, das ich mir denken kann, könnte so ein problem nur auftreten, in einem tab!
Update 2
Nicht so zuverlässig wie ich dachte, aber auf jeden Fall tritt nur auf, wenn mehr als ein Reiter von der gleichen Seite geöffnet ist. Es werden auftreten, alle paar lädt eine der Registerkarten öffnen
Habe ich auch meine aktualisierten code zu zeigen, eine Warnung, wenn pageLoad(if-Anweisung) ist zunächst nicht definiert und wenn es wird zunächst definiert. Irgendwie, beide Warnungen werden angezeigt. Dieser code wird nicht dupliziert, in die gerenderte Seite und es gibt keinen Weg, es wird zweimal genannt. Es ist in einem top-level-script-element nicht umgeben von einer Funktion oder nichts! Mein code endet auf der Suche wie
if(pageLoad===undefined){
var pageLoad=function(){};
alert('new');
} else {
alert('old');
}
Versucht das jsbin Seite und reloaded paar mal und nicht Abstürzen. Im mit Firefox 5.0
Nun, es sieht aus wie die Javascript-intepreter in der Regel hat ein limit von 3000 inline-Aufrufe. Und wenn das verschiedene Browser verwenden verschiedene intepreters dann dies ist, warum Sie sehen den Fehler auf Firefox alleine. Sind Sie in der Lage zu reproduzieren, die Fehler mit dem jsbin-Beispiel?
Haben Sie Funktionen aufrufen oder sich Aliase von selbst. Ich bin mir nicht sicher, ich verstehe, warum Sie verwirrt sind, dass Sie immer Rekursion Fehler.
es führen nicht mehr zum Absturz von firefox, werde es nur geben, ein "too much recursion" Fehler in der javascript-Fehler melden
InformationsquelleAutor Earlz | 2011-07-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den code in Frage - von selbst -- sollte nie Folge in eine unendliche Rekursion Problem-es gibt keine Funktion-Anweisung und die Funktion Objekte werden mit Spannung der Variablen zugewiesen. (Wenn
pageload
ist zunächst undefiniert, es zugeordnet wird, eine No-Operation-Funktion, siehe Nächster Abschnitt.)Ich vermute, es ist zusätzlicher code/Ereignisse, die das auslösen des Verhaltens. Eine Sache, die kann Ursache ist es, wenn das Skript/code ausgelöst wird zweimal während Seite Leben. Das 2. mal
pageload
wird nicht undefiniert und wird behalten Sie den ursprünglichen Wert, wenn es die Funktion, dass Anrufe auf die anderen beiden Funktionen, wird zu einer unendlichen Rekursion führen.Ich würde empfehlen, die Reinigung der Ansatz-und alle Probleme, die durch die Komplikationen einfach zu verschwinden 😉 Was ist die gewünschte Absicht?
Happy coding.
Eine teilweise post-back nicht "reset" der Seite -- so
pageload
noch definiert werden. Der Fall in die 2. Sektion ist wahrscheinlich auftreten. Genau, wo/wie erfordert einen größeren Kontext. (Zum Beispiel ist der JavaScript-code-Teil des post-back Resultat selbst?)+1, sehr guter Punkt auf dieser code wird zweimal genannt. Dann es wäre Rekursion.
gut, dass macht Sinn, aber dies geschieht auf einer Seite ohne zu aktualisieren, panels, also das ist nicht ganz Sinn macht.
Keine Ahnung dann. Sie einfachsten "beheben" wäre zum entfernen der angegebenen check und immer weisen die N-OP-Funktion.
InformationsquelleAutor
Dies ist nur einige zusätzliche Informationen, die für andere Menschen auf der Suche nach ähnlich "too much recursion" - Fehler in Ihrem code. Sieht aus wie firefox (als Beispiel) bekommt zu viel Rekursion bei etwa 6500 stack-frames, die tief in diesem Beispiel:
function moose(n){if(n%100 === 0)console.log(n);moose(n+1)};moose(0)
. Ähnliche Beispiele sehen können tiefen zwischen 5000 und 7000. Nicht sicher, was die entscheidenden Faktoren sind, aber es scheint die Anzahl der Parameter in der Funktion drastisch verringern Sie die stack-frame-Tiefe, in der Sie eine "too much recursion" - Fehler. Zum Beispiel, dies wird nur bis 3100:Wenn Sie möchten, dies zu umgehen, können Sie mit setTimeout zu planen Iterationen weiter aus dem scheduler (das setzt den stack). Funktioniert dies nur, wenn Sie nicht brauchen, um wieder etwas aus dem Aufruf:
Richtigen Schwanz ruft in ECMAScript 6 zu lösen, wird das problem für einige Fälle, wo Sie brauchen, um etwas zurückgeben von aufrufen wie diesem. Bis dahin, für die Fälle mit tiefen Rekursion, die nur Antworten, die entweder iteration, oder die
setTimeout
Methode, die ich erwähnt.InformationsquelleAutor B T
Stieß ich auf diesen Fehler. Das Szenario in meinem Fall war das anders. Der Täter war der code so etwas wie dieses (die einfache Verkettung rezessiv)
Fand ich, dass JavaScript-Fehler auf 180 Rekursion. Bis 179 Schleife, der code läuft einwandfrei.
Verhaltensweisen in Safaris ist genau das gleiche, außer, dass der Fehler zeigt es ist "RangeError: Maximum call stack size exceeded". Es wirft diese Fehlermeldung auf 180 Rekursion als gut.
Obwohl dies nicht im Zusammenhang mit Funktion nennen, aber es könnte helfen, jemand, sind dabei geblieben.
InformationsquelleAutor Hammad Khan
Afaik, kann dieser Fehler auch angezeigt, wenn Sie einen falschen parameter für Ihre ajax-request, wie
Soll und dann werden
statt.
InformationsquelleAutor Blauhirn
Ich habe den gleichen Fehler nach der Aktualisierung meines Firefox. Es scheint, dass die version von Firefox verursacht Problem, da wenn ich versuchte, Sie in anderen Browsern wie Chrome funktioniert es.
InformationsquelleAutor ddsultan