Ich bekomme einige clientseitige Probleme mit dem Überlauf von Javascript-Stapeln speziell im IE-Browser. Dies geschieht in einer Bibliothek eines Drittanbieters, die einige Funktionsaufrufe ausführt, und aus irgendeinem Grund bremsen sie gelegentlich im IE nur aufgrund des niedrigen Stapellimits.
Ich habe dann einen kleinen Test-HTML-Code codiert, um die Stapelgrößenbeschränkung für einige Browser zu testen, und festgestellt, dass IE8 im Vergleich zu FF 7 oder Chrome 14, die auf einem Laptop mit Windows 7-Betriebssystem und 8 GB RAM ausgeführt werden, tatsächlich eine kleine Stapelbeschränkung aufweist:
<html>
<body>
<!-- begin Script: -->
<script type="text/javascript">
function doSomething(){
var i = 3200;
doSomethingElse(i);
}
function doSomethingElse(i){
if (i == 0) return -1;
doSomethingElse(i-1);
}
doSomething();
</script>
<!-- END OF PAGE -->
</body>
</html>
IE erhöht den Stapelüberlauf, wenn die Werte bei 3200 liegen. Firefox und Chrome können im Vergleich zum IE eine sehr tiefe Rekursion verarbeiten.
Ich würde gerne wissen, ob es eine Möglichkeit gibt, die Stack-Overflow-Ausnahme mit der Javascript-Funktion zu verknüpfen, die sie zur Laufzeit im IE oder einem anderen Browser ausgelöst hat, und ob sie den Stacktrace mit der Funktionskette im Stack im Moment geben könnte Fehler wurde ausgelöst.
quelle
Antworten:
Mit einem einfachen Test :
var i=0; function inc() { i++; inc(); } inc();
Internet Explorer
Mozilla Firefox
Google Chrome
Safari
Oper
Verwenden Sie in Bezug auf Ihre Frage die Entwicklertools Ihres Browsers, um den Stapel anzuzeigen. F12Klicken Sie in IE 8+ auf , gehen Sie zur Registerkarte Skript und klicken Sie auf Debugging starten. Es wird unterbrochen, wenn eine Ausnahme ausgelöst wird, und Sie können den Aufrufstapel sehen. Sie können auch die Entwicklertools von Chrome verwenden, Ctrl+ Shift+ J.
quelle
Dies ist browserspezifisch, nicht nur die Stapelgröße, sondern auch Optimierungen, wie die Optimierung der Schwanzrekursion und so weiter. Ich denke, die einzig verlässliche Sache hier ist, auf eine Weise zu codieren, die nicht Unmengen von Dingen in den Stapel legt, oder jeden Browser manuell zu testen (tief in die Dokumentation zu lesen). Wenn Sie den Fehler "zu viel Rekursion" oder ähnliches sehen, wissen Sie bereits, dass mit Ihrem Code etwas wirklich nicht stimmt.
quelle
array1.push(...array2)
, ist viel schneller alsarray1 = array1.concat(array2)
"maximale Stapelgröße überschritten", wenn Array2 zu lang ist. siehe hier