Javascript ist ereignisgesteuert. JavaScript ist eine objekt- und ereignisgesteuerte Skriptsprache mit Sicherheitsfunktionen. Sie verwendet einen ereignisgesteuerten Mechanismus, um auf Benutzeroperationen zu reagieren Es.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, JavaScript-Version 1.8.5, Dell G3-Computer.
JavaScript ist eine objekt- und ereignisgesteuerte Skriptsprache mit Sicherheitsfunktionen.
Dieser Artikel erläutert den ereignisgesteuerten Mechanismus von JavaScript auf der Browserseite bzw. der Serverseite (node.js) und fügt einige asynchrone Programmierbeispiele hinzu, um das Verständnis zu vertiefen.
Der ereignisgesteuerte Mechanismus von JavaScript auf der Browserseite
Zunächst läuft JavaScript in einem einzigen Thread auf der Browserseite, der vom Browser bestimmt wird. Dies dient dazu, Konflikte zu vermeiden, wenn mehrere Threads unterschiedliche Aufgaben ausführen . Mit anderen Worten: Der von uns geschriebene Javascript-Code läuft nur in einem Thread, dem sogenannten Hauptthread (HTML5 bietet eine Web-Worker-API, die es dem Browser ermöglicht, einen Thread zu öffnen, um komplexere und zeitaufwändigere Javascript-Aufgaben auszuführen, aber dieser Thread ist immer noch vorhanden unterliegen der Haupt-Thread-Kontrolle). Wenn wir für einen einzelnen Thread einige „Ruhe“-Vorgänge wie:
var now = + new Date()while (+new Date() <p> ausführen, wird der Thread innerhalb von fast einer Sekunde blockiert und kann die folgenden Aufgaben nicht mehr ausführen. </p><p>Es gibt auch einige Vorgänge wie das Abrufen von Remote-Daten, E/A-Vorgänge usw., die sehr zeitaufwändig sind. Wenn die Synchronisierungsmethode verwendet wird, wird der Prozess aufgrund der zeitaufwändigen Ausführung dieser Vorgänge nur warten Wie oben und unten können Aufgaben nur warten, was nicht effizient ist. Um das durch einzelne Threads verursachte Blockierungsproblem zu lösen, haben viele Betriebssysteme einen asynchronen Programmiermechanismus implementiert. Dies wird auch in <strong>Browsern</strong> durchgeführt. Die Hauptleistungen sind wie folgt: </p>
Javascript-Code nur im Hauptthread ausführen
Hauptthread Es tritt in die Ereignisschleife ein, sobald es gestartet wird. Der gesamte Prozess ist eine kontinuierliche Schleife, bei der die Rückruffunktion ständig ausgeführt wird. Bei Netzwerkanfragen, E/A-Vorgängen usw. öffnet der Browser eine separate Schleife Arbeitsthread, um es zu verarbeiten und entsprechende Beobachtungen einzurichten, oder dann sofort zum Hauptthread zurückzukehren, um die folgenden Aufgaben auszuführen
Nachdem der vom Browser geöffnete Thread die Aufgabe verarbeitet hat oder ein überwachtes Ereignis hat , Es verwendet die erhaltenen Daten (oder Eingaben), um ein Ereignis zu bilden und es in der entsprechenden Beobachtung zu platzieren. In der Ereigniswarteschlange des Autors befindet sich die Ereigniswarteschlange im Hauptthread. Der Hauptthread führt eine kontinuierliche Schleife durch und überprüft ständig die Ereigniswarteschlange und führt die den Ereignissen entsprechenden Rückruffunktionen nacheinander aus, indem die Ereignisse durchlaufen werden. Hinweis: Im Bild unten wird die Nachrichtenwarteschlange im Hauptthread gespeichert Egal wo Sie die Anfrage schreiben, sie befindet sich immer in der Callback-Funktion. Da der ereignisgesteuerte Mechanismus alles in Ereignisse abstrahiert, ist der Beginn der Codeausführung ebenfalls ein Ereignis und die Rückruffunktion wird implizit aufgerufen. Durch Aufrufen der Rückruffunktion wird die Ausführung des Codes gestartet. Dann kehrt der Hauptthread unmittelbar nach dem Initiieren der asynchronen Aufgabe zurück und führt weiterhin den folgenden Code in der Rückruffunktion aus, die dem „Code-Startereignis“ entspricht. Wenn die Rückruffunktion abgeschlossen ist, wird das nächste Ereignis ausgeführt. Während dieser Zeit schließt der Ajax-Thread die Anforderung ab und sendet dann das Anforderungsabschlussereignis (einschließlich der zurückgegebenen Daten) an das Ende der Ereigniswarteschlange, um auf die Verarbeitung zu warten. Wenn der Hauptthread dieses Ereignis ausführt, wird dies von der angegebenen Rückruffunktion ausgeführt ausgeführt werden.
console.log("开始");setTimeout(function(){ console.log('延迟执行的') }, 1000);setTimeout(function(){ console.log('立即执行的') }, 0); console.log('结束') //开始 结束 立即执行的 延迟执行的
watcher
-Mechanismuswatcher
, Beobachter, ist ein wichtiger Mechanismus für ereignisgesteuerte Systeme.
setTimeout
wird als Timer bezeichnet, bei dem es sich um eine vom Browser bereitgestellte API handelt. Immer wenn Sie einen Timer verwenden, legt diese Funktion einen Beobachter
, einen Beobachter, fest. Der Hauptthread wird hier weiterlaufen und „durchlaufen“, um die Zeit zu überprüfen. Wenn der Hauptthread überprüft, ob das Zeitintervall den Anforderungen entspricht, wird ein Timer-Ereignis generiert und der Ereigniswarteschlange watcher
hinzugefügt und eine Rückruffunktion wird ausgeführt. Daher wird beim Ausführen von setTimeout
nur dann eine Nachricht zum Aufrufen der Rückruffunktion generiert und zur Ereigniswarteschlange hinzugefügt. Daher wird die Rückruffunktion nicht unbedingt zum angegebenen Zeitpunkt aufgerufen wie viele vorherige Ereignisse auf die Verarbeitung warten.
Ich habe gerade über Timer-Beobachter sowie E/A-Beobachter, Netzwerkanforderungsbeobachter, Mausereignisbeobachter, Tastaturereignisbeobachter usw. gesprochen. Wir stoßen häufig auf Ereignisüberwachungsfunktionen, die Sie auffordern, eine Rückruffunktion zu binden, diese Art des Abhörens Die Funktion legt normalerweise einen Watcher
fest, und von anderen Threads generierte Ereignisse werden ebenfalls in die Ereigniswarteschlange des entsprechenden Watchers
gestellt, sodass dies bei jedem Watcher
der Fall ist watcher
,其他线程产生的事件也会放到相应watcher
的事件队列中,因此每个watcher
会产生自己的事件队列。主线程在循环的时候,实际上是在依次调用这些watcher
,检查每个watcher
的事件队列,有事件就执行相应的回调。
它的过程就是 :
进程一启动就进入事件循环
有监听就添加watcher
遍历watcher
下的事件队列
执行下一个watcher
事件驱动机制,它会有各种各样的事件,大量的事件,它所做的一切都跟处理事件有关。但并不是所有的事件都有watcher
,如果都有,主进程任务会变得非常繁重,况且有些事件我们并不关心,例如你只写了一个定时器,代表你关心这个事件,那么点击事件、网络请求事件就不用关心,因为你根本就没写啊,也就没有watcher
Erstellen Sie eine eigene Ereigniswarteschlange
Wenn sich der Hauptthread in einer Schleife befindet, ruft er tatsächlich diese Watcher
nacheinander auf, überprüft die Ereigniswarteschlange jedes Watchers
und führt den entsprechenden Rückruf aus, wenn ein Ereignis vorliegt.
watcher
hinzu.
watcher
watcher
ereignisgesteuerten Mechanismus aus. Es gibt verschiedene Ereignisse, eine große Anzahl von Ereignissen und alles, was es tut, hängt mit der Verarbeitung zusammen Ereignisse. Aber nicht alle Ereignisse haben einen watcher
. Wenn dies der Fall ist, wird die Aufgabe des Hauptprozesses sehr umfangreich. Außerdem sind uns einige Ereignisse egal, wenn Sie beispielsweise nur einen Timer schreiben. Das bedeutet, dass Sie sich für dieses Ereignis nicht um Klickereignisse und Netzwerkanforderungsereignisse kümmern müssen, da Sie diese überhaupt nicht geschrieben haben, sodass es keinen Watcher
gibt.
Das obige ist der detaillierte Inhalt vonWelchen Treiber verwendet Javascript?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!