Wird Javascript beim Laden analysiert / interpretiert? (IE)

8

Ich weiß zum Beispiel, wenn Chrome eine Javascript-Datei herunterlädt, wird sie interpretiert und JITed.

Meine Frage ist, wenn IE6,7,8, zuerst eine Javascript-Datei herunterladen, wird das Ganze geparst und interpretiert?

Mein Verständnis war, dass nur die Funktionssignaturen der obersten Ebene und alles, was im globalen Bereich ausgeführt wurde, beim Laden geparst wurde. Und dann wurden Funktionskörper und der Rest bei der Ausführung geparst.

Wenn sie beim Laden vollständig geparst werden, was würde Ihrer Meinung nach die Zeitersparnis bedeuten, wenn die Funktionskörper verschoben würden, die später heruntergeladen und geparst werden?

    
Adam 11.12.2009, 17:19
quelle

4 Antworten

2

Ja, in allen Browsern blockiert das Herunterladen der Ressource alles andere auf der Seite (CSS-Download, anderes JS-Herunterladen, Rendering), wenn dies mit einem <script> -Tag gemacht wird.

Wenn Sie das gesamte Javascript am Anfang oder auf Ihrer Seite laden, werden Sie Schluckauf sehen, da eine Anfrage etwa 50 ms dauert und das Parsen für eine Bibliotheksdatei oder etwas Ähnliches mehr als 100 ms lang sein kann. 100ms wird als Standard verwendet, für den etwas Größeres vom Benutzer als "Verzögerung" wahrgenommen wird.

Die Zeitersparnis ist zwar vernachlässigbar, aber der leichte Verlust der Benutzererfahrung bei Pausen beim Laden Ihrer Seite kann abhängig von Ihrer Situation erheblich sein.

Siehe LABjs für viele Artikel und großartige Erklärungen zu den Vorteilen des Verschiebens und Parsens.

    
James van Dyke 11.12.2009, 17:27
quelle
5

Sie werden beim Laden vollständig analysiert. (IE muss das Skript analysieren, um zu wissen, wo jeder Funktionskörper endet.) In den Open-Source-Implementierungen wird jede Funktion gleichzeitig in Bytecode oder sogar in Maschinencode übersetzt, und ich stelle mir vor, dass IE auf die gleiche Weise funktioniert .

Wenn Sie eine Seite haben, die tatsächlich zu langsam lädt, und Sie können das Laden von 100 KB Skript, das Sie wahrscheinlich nicht verwenden werden, verzögern, könnte es Ihre Ladezeiten helfen. Oder nicht - sehen Sie das Update unten.

(Trivia: JS-Benchmarks wie Sunspider messen im Allgemeinen nicht die Zeit, die zum Analysieren und Kompilieren des Codes benötigt wird.)

UPDATE - Seit ich diese Antwort gepostet habe, haben sich die Dinge geändert! Implementierungen analysieren immer noch jedes Skript beim Laden mindestens so, dass Syntaxfehler erkannt werden, wie vom Standard gefordert. Manchmal verschieben sie jedoch die Kompilierungsfunktionen, bis sie zum ersten Mal aufgerufen werden.

    
Jason Orendorff 11.12.2009 17:23
quelle
3

Da das Definieren einer Funktion tatsächlich eine Operation ist, wird Ihre gesamte JavaScript-Datei analysiert, und alle Operationen der obersten Ebene werden interpretiert. Der Code innerhalb Ihrer Funktionen wird nicht wirklich ausgeführt, bis er aufgerufen wird, aber er wird analysiert.

zum Beispiel:

%Vor%

Im obigen Beispiel wird alles geparst und die Zeilen 1 und 2 werden ausgeführt. Zeile 3 wird jedoch erst ausgeführt, wenn sie aufgerufen wird.

Es gibt kleine "Wahrnehmungsspiele", die Sie mit Ihren Benutzern spielen können, wie zum Beispiel die Skript-Tags ganz unten im HTML-Code und nicht oben, damit der Browser den oberen Rand der Seite rendern kann, bevor er die Anweisungen erhält um das Javascript herunterzuladen und zu analysieren. Sie könnten Ihre Funktionsdefinitionen wahrscheinlich auch in eine document.onload-Funktion verschieben, so dass sie erst ausgeführt werden, nachdem die gesamte Seite geladen und im Speicher abgelegt wurde. Dies kann jedoch zu einem "Aufblitzen von unbestätigtem Inhalt" führen, wenn Ihr JavaScript visuelle Stile auf Dinge anwendet (z. B. jQuery UI-Objekte).

    
Adam Ness 11.12.2009 17:29
quelle
1

Was meinst du mit "Downloads"? Wann ist es im Tag enthalten oder wird es über XMLHttpRequest heruntergeladen?

Wenn Sie die Aufnahme per Skript meinen, dann interpretiert der IE alle js-Dateien auf einmal. Andernfalls können Sie keine Funktionen in dieser Datei aufrufen oder eine Syntaxfehlermeldung anzeigen.

Wenn Sie Download von XMLHttpRequest meinen, müssen Sie den Inhalt der Datei selbst auswerten.

    
nemisj 11.12.2009 17:29
quelle