Internet Explorer 8 (die ich unterstützen muss, leider nicht verhandelbar) zeigt the following warning once 5,000,000 "executed script statements" have occurred in one synchronous script execution (z. B. von einem Timeout oder von einem Ereignishandler).Was zählt als eine "ausgeführte Skript-Anweisung" für IE "Stop dieses Skript ausführen?" Warnungszähler?
Stop läuft dieses Skript? Ein Skript auf dieser Seite verursacht, dass Ihr Web Browser langsam ausgeführt wird. Wenn es weiterhin ausgeführt wird, reagiert Ihr Computer möglicherweise nicht mehr .
Ich versuche, einige komplexe, schwere Code zu optimieren, um diese Fehlermeldung zu vermeiden. Ich habe bereits den Standard-Ratschlag befolgt, der, wo möglich, den Code in separate asynchrone Brocken mit Dingen wie setTimeout()
brechen soll. Ich kann nicht mehr davon machen, ohne Race Conditions zu erstellen, also suche ich den ganzen Code zu straffen, der oft passiert, z.B. innerhalb großer for
Schleifen.
Um dies zu tun, Ich möchte verstehen, was genau IE als eine "ausgeführte Skript-Anweisung" zählt, so werde ich wissen, welche Optimierungen in meinen Schleifen den Unterschied machen und welche nicht.
Ich habe nach Standarddefinitionen von "ausgeführten Skriptanweisungen" gesucht, ohne Erfolg - die meiste Zeit wird "Skriptanweisung" verwendet, es scheint sich auf den Inhalt eines html <script>
Tags zu beziehen, was eindeutig eine andere Richtung der Begriff. Die Definition ist hilfreich, lässt aber einige Zweifel darüber, wie sie gezählt werden (siehe Beispiele unten).
Here's what Microsoft have to say on the matter (Ich habe hinzugefügt Absatzumbrüche zur besseren Lesbarkeit):
Ab Internet Explorer 4.0 und späteren Versionen, ist die Time-out nicht mehr ein fester Wert, basierend auf Windows-Meldungen. Internet Explorer verfolgt nun die Gesamtzahl der ausgeführten Skriptanweisungen und setzt den Wert jedes Mal zurück, wenn eine neue Skriptausführung gestartet wird, z. B. von einem Zeitlimit oder einem Ereignishandler für die aktuelle Seite mit der Skript-Engine.
Internet Explorer zeigt ein Dialogfeld "Skript mit langer Laufzeit" an, wenn dieser Wert über einem Schwellenwert liegt.
Der Internet Explorer überprüft nicht bei jeder Anweisung, ob der Wert überschritten ist. Periodisch fragt das Skriptmodul Internet Explorer mit der Anzahl der ausgeführten Anweisungen ab, und Internet Explorer prüft, ob das Limit überschritten ist. Aufgrund dieses Mechanismus ist es möglich, mehr als das Standardlimit ohne das Dialogfeld auszuführen, wenn die gesamte Skriptausführung abgeschlossen ist, bevor das Skriptmodul Internet Explorer abfragt.
einige einfache Beispiele zu geben, die mir zweideutig scheinen:
- Would
var a = 1, b = 2, c = 3;
zählen als ein „ausgeführt Skript-Anweisung“ undvar a = 1; var b = 2; var c = 3;
zählen als drei? Oder wären beide drei? - Would
if(someFunction()){}
(keine Aussagen innerhalbsomeFunction()
sein, eine Aussage zu zählen, oder zwei (ein Anruf plus eine bedingte)? - Ist
if(a){}else{}
eine bedingte Anweisung oder zwei? Wenn man,if(a){}else if(b){}
if(a==b||(c&&a==c&&c==d)){}
ein - Ist zwei? Würde , zwei, drei, vier, fünf Aussagen (oder mehr?)?Ich bin mir bewusst, dass alles wie
if(a){}
eine Javascript-Funktion aufruft, um in boolean zu konvertieren - würde dies zusätzliche Aussagen zusätzlich zu den Vergleichen hinzufügen? - Würde
var value = someFunction(); if(value){}
drei sein, da es eine Zuweisung hinzufügt, oder würde der Funktionsaufruf als Teil der Zuweisungsanweisung gezählt werden? - Was ist mit Verkettung? Zum Beispiel, wenn jQuery verwendet wird, dann (ohne die ausgeführten Skriptanweisungen innerhalb von jede Funktion) ist die Zeile
$(selector).show().css(obj).appendTo($el);
eine "Skriptanweisung ausgeführt", oder vier? Ich würde mir vorstellen, es wären vier "Call" -Aussagen. - Vermutlich würde var
$someEl = $(selector).show().css(obj).appendTo($el);
dies auf fünf Aussagen erhöhen - vier Anrufe plus eine Zuweisung? (IE würde zählt nicht nur als eine Zuweisungsanweisung und weitermachen?)
Natürlich ist diese einfachen Beispiele oben sind kleine Fische - ich versuche, „den Feind kennen“ hier in der Lage zu sein, zu beurteilen, wie sie am besten um komplexe Schleifen zu optimieren.
Ich bin entweder für eine Faustregel oder einige suchen erklärt Beispiele wie die oben
kann ich definitiv nicht sagen, aber 'var whatever' zählt fast sicher nicht, da die Anweisung zur Laufzeit nicht ausgeführt wird. Davon abgesehen ist es wahrscheinlich, dass eine Zeile Code ausgeführt wird, sei es if (foo) {'oder Ihre lange jQuery-Kette am Ende. Die jQuery-Kette führt jedoch wahrscheinlich einige hundert Codezeilen aus der jQuery-Bibliothek aus. Mit anderen Worten, # 1 ist 0, # 5 ist 2 (getrennt durch das Semikolon), alle anderen sind 1. Aber Sie müssen den Codepfaden folgen, um zu sehen, wie viel Code tatsächlich in # 2, # 5 ausgeführt wird. # 6, # 7 –