2012-03-30 4 views
10

Falls Sie nicht wissen, was ich rede, lesen Sie bitte John Resig - How JavaScript Timers Work und Is JavaScript guaranteed to be single-threaded?Was löst die Ausführung von JavaScript-Code aus?

Es gibt mehrere Auslöser sind die Aufgaben in der JS-Motoren Ausführung FiFo einreihen. Dies ist kein Standard, also versuche ich eine erschöpfende Liste dieser Auslöser zu finden. (Ich denke, es läuft alles auf interne Event-Handler, wie Skript Lastereignisse oder Timer-Ereignisse, aber ich würde lieber die Motoreinbauten ignorieren und sehen die Dinge aus der Sicht des Benutzers aus gesehen.)

So bis jetzt habe ich

  • <script> Elemente in dem Ausgangsdokument (einschließlich denen, hinzugefügt von document.write) identifiziert *
  • <script> von JS eingefügten Elementen zur Laufzeit *
  • Ereignis handl ers
    - dazu gehören eine Vielzahl von Fällen, wie zB Interaktion mit dem Benutzer, Fehlerereignisse, Web Worker-Nachrichten oder Ajax Rückrufe ...
  • window.setTimeout
  • window.setInterval

*) nur in Browser/DOM-Umgebungen

Noch mehr? Irgendwelche Unterschiede zwischen JS-Maschinen?

+0

Ähnlich wie bei window.setTimeout und window.setInterval gibt es jetzt window.requestAnimationFrame, das versucht, die Funktion beim nächsten Auffrischen des Bildschirms auszulösen (normalerweise 1/60stel Sekunde). – jcmiller11

+1

Sie können 'setTimeout() 'und' setInterval() 'zusammen mit Event-Handlern, weil sie das sind: zeitgesteuerte Ereignisse. Grundsätzlich gibt es nur zwei Dinge: Event-Handler und das Laden von Skripten. – slebetman

Antwort

1

"JavaScript" als Sprache sollte nicht wirklich verwendet werden, es ist zu breit.

ECMAScript ist das, worauf Sie sich beziehen. Informationen zu ECMAScript finden Sie unter http://www.ecmascript.org/ . Der Sprachstandard heißt ECMA-262, wobei die Version 5.1 von den meisten Browsern unterstützt wird.

setTimeout, setInterval, DOM-Ereignisse und mehr sind nicht Teil der Sprache. Diese werden von der Host-Umgebung als Host-Objekte bereitgestellt. Das Schreiben von ECMAScript für eine Vielzahl von Host-Umgebungen sollte besondere Vorsicht bei der Verwendung von Host-Objekten darstellen.

ECMAScript-Code wird in einem Ausführungskontext ausgeführt. Dies nimmt die Form eines Stapels an und hält den Status des aktuellen Ausführungskontexts an der Spitze.

Es gibt drei Möglichkeiten, einen Ausführungskontext zu pushen. Globaler Code, Eval und Funktion. Dies ist die einzige Möglichkeit, Code zu starten. Hostumgebungen verwenden diese Methoden zum Ausführen von Code.

Die Host-Umgebung kann einen Call-Stack bereitstellen. Dies wird verwendet, um Funktionsaufrufe zu stapeln, die von Host-Objekten erzeugt werden, die in unabhängigen Threads laufen können. Normalerweise fügt ein Ereignis wie setTimeout dem Aufrufstapel eine Funktion hinzu. Die Host-Umgebung wartet dann, bis der Ausführungskontextstapel leer ist. Anschließend ruft sie die Funktion aus dem Aufruf-Stack auf, erstellt einen neuen Ausführungskontext und führt den Code bis zum Abschluss aus. Dies wird so lange wiederholt, bis der Aufrufstapel leer ist.

Der Versuch, eine umfassende Liste von Kontextmanagern für die Ausführung von Hostobjekten zu erstellen, ist sinnlos.

Um die Fragen zu beantworten.

Noch mehr? Ja, es gibt viele mehr.Dies geht über den Rahmen dieser Antwort hinaus. Beziehen Sie sich auf die jeweilige Host-Umgebung, die Sie verwenden möchten.

Unterschiede zwischen JS-Engines? (ECMAScript Host-Umgebungen). Ja. Auch dies außerhalb des Umfangs dieser Antwort und abhängig vom Host

Es gibt Dutzende von Host-Umgebungen, mit neuen die ganze Zeit erstellt. Was die Erstellung eines neuen Ausführungskontexts auslöst, hängt stark von der Hostumgebung ab.

Verwandte Themen