Eingehende Analyse des Ereignisausführungsmechanismus in JS
Dieser Artikel vermittelt Ihnen ein tiefgreifendes Verständnis des Ereignisausführungsmechanismus in JavaScript, indem er die Drucksequenz eines Codeabschnitts analysiert. Ich hoffe, er wird Ihnen hilfreich sein!
Ich war vor einiger Zeit etwas verwirrt über eine schriftliche Testfrage. Heute werden wir den Ereignisausführungsmechanismus von JS gründlich analysieren. [Verwandte Empfehlungen: Javascript-Lern-Tutorial]
Schauen Sie sich zuerst einen Code an
Freunde können versuchen, die Druckreihenfolge aufzuschreiben
Einzelner Thread
JS
Als Browser-Skriptsprache besteht der Hauptzweck von Js
darin, das DOM zu betreiben, das festlegt, dass JS
Single-Threaded sein muss. Code> ist wie Java. Es ist auch multithreaded. Wenn zwei Threads das DOM gleichzeitig betreiben, wie sollte der Browser dies ausführen? JS
主要作为浏览器的脚本语言,Js
的主要用途是操作DOM,这就决定了JS
必须是单线程,如果JS
如Java一样是多线程,如果两个线程同时操作DOM,那么浏览器应该怎么执行呢?
JS
的发布其实是为了蹭Java的热度,其中编写这门语言的时间并不久,所以这也就是为什么JS是单线程的原因
JS执行机制
JS既然是单线程,那么必然会对任务进行一个排序。所有的任务都将按照一个规则执行下去。
同步任务
异步任务
同步任务和异步任务进入执行栈中,JS会先判断任务的类型
是同步任务,直接进入主线程
是异步任务,进入
Event Table
中,注册回调函数Event Queue
同步任务全部执行结束,JS会
Event Queue
中读取函数执行这个过程会反复执行,直到全部任务执行结束。这就是我们常说的
事件循环
JS如何判断执行栈为空
emmmm,我不知道。。。。JS应该有一套自己独有的逻辑去判断执行栈是否为空。
异步任务
异步的任务执行顺序为:宏任务——>微任务
异步任务可分为
宏任务
微任务
常见的宏任务
I/0
setTimeout
setInterval
常见的微任务
Promise
.then
.catch
答案
vite 之前配置的一个插件,版本有些问题,不要管这个红色报警
分析
开始了
是一个同步任务,最先进入执行栈中执行
task()
函数,a
是一个同步任务,进入执行栈中async/await 是异步转同步的过程,第一行代码会同步执行,以下的代码会异步。
b
作为一个同步任务进入执行栈中a end
成为了异步任务的微任务,进入执行栈中,
目前为止,同步任务队列依次是 开始了
, a
, b
目前为止,异步任务队列依次是 宏任务: setTimeout
微任务:a end
如果没有后续代码,打印顺序如下
那么问题来了,不是说宏任务会比微任务提前执行吗,为什么setTimeout
打印在a end
之后呢?
看这张图
setTimeout 作为了宏任务进入了任务队列。所以造成了这种原因
通俗来讲:
async await 导致了微任务的产生,但是这个微任务所属于当前的宏任务。所以会先执行a end
,执行完毕判断当前宏任务结束。执行下一个宏任务,打印出了setTimeout
继续走流程
c
由于Promise的转化,变为同步任务进入到任务队列中c end
作为Promise衍生的微任务进入任务队列-
Die Veröffentlichung vond
JS
soll eigentlich die Popularität von Java ausnutzen. Die Sprache wurde vor nicht allzu langer Zeit geschrieben, daher ist JS Single-Threaded🎜🎜JS-Ausführungsmechanismus🎜🎜🎜Da JS Single-Threaded ist, müssen Aufgaben sortiert werden. Alle Aufgaben werden nach einer Regel ausgeführt. 🎜
- 🎜Synchrone Aufgaben🎜
- 🎜Asynchrone Aufgaben🎜
🎜🎜Synchronisierte Aufgaben und asynchrone Aufgaben werden in den Ausführungsstapel eingegeben. JS bestimmt zunächst den Typ der Aufgabe🎜
- 🎜 ist eine synchrone Aufgabe und geht direkt in den Hauptthread ein🎜
- 🎜 ist eine asynchrone Aufgabe. Geben Sie die
Ereignistabelle
ein und registrieren Sie die RückruffunktionEreigniswarteschlange
🎜 - 🎜Nachdem alle Synchronisierungsaufgaben ausgeführt wurden, liest JS die Funktion aus der
Ereigniswarteschlange
und führt sie aus🎜 - 🎜Dieser Prozess wird wiederholt ausgeführt werden, bis alle Aufgaben ausgeführt sind. Das nennen wir oft
Ereignisschleife
🎜
🎜Wie stellt JS fest, dass der Ausführungsstapel leer ist🎜 h4>🎜 emmmm, ich weiß es nicht. . . . JS sollte über eine eigene eindeutige Logik verfügen, um festzustellen, ob der Ausführungsstapel leer ist. 🎜🎜Asynchrone Aufgaben🎜🎜🎜Die Reihenfolge der asynchronen Aufgabenausführung ist: Makroaufgaben -> Mikroaufgaben 🎜🎜Asynchrone Aufgaben können in 🎜
- 🎜 Makroaufgaben unterteilt werden 🎜
- 🎜Mikroaufgaben🎜
🎜Gemeinsame Makroaufgaben🎜
- 🎜 I/ 0🎜
- 🎜setTimeout🎜
- 🎜setInterval🎜
🎜Gemeinsame Mikrotasks🎜
- 🎜Promise🎜
- 🎜.then🎜
- 🎜.catch🎜
Antworten🎜🎜vite Es ist bereits ein Plug-in konfiguriert. Es gibt einige Probleme mit der Version. Ignorieren Sie diesen roten Alarm.
🎜Analyse🎜
- 🎜
Gestartet ist eine synchrone Aufgabe und betritt als erste den Ausführungsstapel 🎜
- 🎜 führt die Funktion
a
aus synchrone Aufgabe und tritt in die Ausführung ein. 🎜
- 🎜async/await im Stapel ist der Prozess der asynchronen bis synchronen Ausführung.
b
tritt als synchrone Aufgabe in den Ausführungsstapel ein 🎜
- 🎜
a end
wird zu einer Mikrotask der asynchronen Aufgabe und tritt in den Ausführungsstapel ein, 🎜 li>
🎜🎜Bisher ist die Synchronisierungsaufgabenwarteschlange Gestartet
, a
, b
🎜🎜🎜🎜Bisher ist The Die asynchrone Aufgabenwarteschlange ist wiederum eine Makroaufgabe: setTimeout
Mikroaufgabe: a end
🎜🎜🎜Wenn kein nachfolgender Code vorhanden ist , die Drucksequenz wie folgt🎜🎜🎜
🎜 🎜Dann stellt sich die Frage: Bedeutet das nicht, dass Makroaufgaben früher ausgeführt werden als Mikroaufgaben? Warum wird setTimeout
nach a end
gedruckt? 🎜🎜Sehen Sie sich dieses Bild an
🎜🎜
🎜🎜setTimeout wird als Makroaufgabe in die Aufgabenwarteschlange eingetragen. Der Grund ist also 🎜🎜Um es für den Laien auszudrücken: 🎜🎜asynchrones Warten führt zur Generierung von Mikroaufgaben, aber diese Mikroaufgabe gehört zur aktuellen Makroaufgabe. Daher wird a end
zuerst ausgeführt und dann wird die aktuelle Makroaufgabe als abgeschlossen beurteilt. Führen Sie die nächste Makroaufgabe aus und drucken Sie setTimeout
🎜🎜Verfolgen Sie den Vorgang weiter🎜
- 🎜
c
Durch die Konvertierung von Promise wird es zu einer synchronen Aufgabe und gelangt in die Aufgabenwarteschlange🎜
- 🎜
c end
Tritt als abgeleitete Mikroaufgabe in die Aufgabenwarteschlange ein von Promise🎜 - 🎜
d
gelangt als Synchronisierungsaufgabe in die Aufgabenwarteschlange🎜
Bisher synchrone Aufgabenwarteschlange
a
b
c
d
Bisher asynchron ous-Aufgabenwarteschlange
a end micro Aufgabe: c Ende der Mikroaufgabe: Makroaufgabe setTimeout alle Der Chef wies darauf hin.
【Empfohlene verwandte Video-Tutorials: - Web-Frontend
】
- 🎜 Makroaufgaben unterteilt werden 🎜
- 🎜Mikroaufgaben🎜
🎜Gemeinsame Makroaufgaben🎜
- 🎜 I/ 0🎜
- 🎜setTimeout🎜
- 🎜setInterval🎜
🎜Gemeinsame Mikrotasks🎜
- 🎜Promise🎜
- 🎜.then🎜
- 🎜.catch🎜
Antworten🎜🎜vite Es ist bereits ein Plug-in konfiguriert. Es gibt einige Probleme mit der Version. Ignorieren Sie diesen roten Alarm.
🎜Analyse🎜
- 🎜
Gestartet ist eine synchrone Aufgabe und betritt als erste den Ausführungsstapel 🎜
- 🎜 führt die Funktion
a
aus synchrone Aufgabe und tritt in die Ausführung ein. 🎜
- 🎜async/await im Stapel ist der Prozess der asynchronen bis synchronen Ausführung.
b
tritt als synchrone Aufgabe in den Ausführungsstapel ein 🎜
- 🎜
a end
wird zu einer Mikrotask der asynchronen Aufgabe und tritt in den Ausführungsstapel ein, 🎜 li>
🎜🎜Bisher ist die Synchronisierungsaufgabenwarteschlange Gestartet
, a
, b
🎜🎜🎜🎜Bisher ist The Die asynchrone Aufgabenwarteschlange ist wiederum eine Makroaufgabe: setTimeout
Mikroaufgabe: a end
🎜🎜🎜Wenn kein nachfolgender Code vorhanden ist , die Drucksequenz wie folgt🎜🎜🎜
🎜 🎜Dann stellt sich die Frage: Bedeutet das nicht, dass Makroaufgaben früher ausgeführt werden als Mikroaufgaben? Warum wird setTimeout
nach a end
gedruckt? 🎜🎜Sehen Sie sich dieses Bild an
🎜🎜
🎜🎜setTimeout wird als Makroaufgabe in die Aufgabenwarteschlange eingetragen. Der Grund ist also 🎜🎜Um es für den Laien auszudrücken: 🎜🎜asynchrones Warten führt zur Generierung von Mikroaufgaben, aber diese Mikroaufgabe gehört zur aktuellen Makroaufgabe. Daher wird a end
zuerst ausgeführt und dann wird die aktuelle Makroaufgabe als abgeschlossen beurteilt. Führen Sie die nächste Makroaufgabe aus und drucken Sie setTimeout
🎜🎜Verfolgen Sie den Vorgang weiter🎜
- 🎜
c
Durch die Konvertierung von Promise wird es zu einer synchronen Aufgabe und gelangt in die Aufgabenwarteschlange🎜
- 🎜
c end
Tritt als abgeleitete Mikroaufgabe in die Aufgabenwarteschlange ein von Promise🎜 - 🎜
d
gelangt als Synchronisierungsaufgabe in die Aufgabenwarteschlange🎜
Bisher synchrone Aufgabenwarteschlange
a
b
c
d
Bisher asynchron ous-Aufgabenwarteschlange
a end micro Aufgabe: c Ende der Mikroaufgabe: Makroaufgabe setTimeout alle Der Chef wies darauf hin.
【Empfohlene verwandte Video-Tutorials: - Web-Frontend
】
- 🎜
Gestartet ist eine synchrone Aufgabe und betritt als erste den Ausführungsstapel 🎜
- 🎜 führt die Funktion
a
aus synchrone Aufgabe und tritt in die Ausführung ein. 🎜 - 🎜async/await im Stapel ist der Prozess der asynchronen bis synchronen Ausführung.
b
tritt als synchrone Aufgabe in den Ausführungsstapel ein 🎜 - 🎜
a end
wird zu einer Mikrotask der asynchronen Aufgabe und tritt in den Ausführungsstapel ein, 🎜 li>
Gestartet
, a
, b
🎜🎜🎜🎜Bisher ist The Die asynchrone Aufgabenwarteschlange ist wiederum eine Makroaufgabe: setTimeout
Mikroaufgabe: a end
🎜🎜🎜Wenn kein nachfolgender Code vorhanden ist , die Drucksequenz wie folgt🎜🎜🎜
🎜 🎜Dann stellt sich die Frage: Bedeutet das nicht, dass Makroaufgaben früher ausgeführt werden als Mikroaufgaben? Warum wird setTimeout
nach a end
gedruckt? 🎜🎜Sehen Sie sich dieses Bild an
🎜🎜
🎜🎜setTimeout wird als Makroaufgabe in die Aufgabenwarteschlange eingetragen. Der Grund ist also 🎜🎜Um es für den Laien auszudrücken: 🎜🎜asynchrones Warten führt zur Generierung von Mikroaufgaben, aber diese Mikroaufgabe gehört zur aktuellen Makroaufgabe. Daher wird a end
zuerst ausgeführt und dann wird die aktuelle Makroaufgabe als abgeschlossen beurteilt. Führen Sie die nächste Makroaufgabe aus und drucken Sie setTimeout
🎜🎜Verfolgen Sie den Vorgang weiter🎜
- 🎜
c
Durch die Konvertierung von Promise wird es zu einer synchronen Aufgabe und gelangt in die Aufgabenwarteschlange🎜
- 🎜
c end
Tritt als abgeleitete Mikroaufgabe in die Aufgabenwarteschlange ein von Promise🎜 - 🎜
d
gelangt als Synchronisierungsaufgabe in die Aufgabenwarteschlange🎜
Bisher synchrone Aufgabenwarteschlange
a
b
c
d
Bisher asynchron ous-Aufgabenwarteschlange
a end micro Aufgabe: c Ende der Mikroaufgabe: Makroaufgabe setTimeout alle Der Chef wies darauf hin.
【Empfohlene verwandte Video-Tutorials: - Web-Frontend
】
c
Durch die Konvertierung von Promise wird es zu einer synchronen Aufgabe und gelangt in die Aufgabenwarteschlange🎜c end
Tritt als abgeleitete Mikroaufgabe in die Aufgabenwarteschlange ein von Promise🎜d
gelangt als Synchronisierungsaufgabe in die Aufgabenwarteschlange🎜a
b
c
d
a end micro Aufgabe: c Ende der Mikroaufgabe: Makroaufgabe setTimeout alle Der Chef wies darauf hin.
】
Das obige ist der detaillierte Inhalt vonEingehende Analyse des Ereignisausführungsmechanismus in JS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



So implementieren Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem. Einführung: Mit der kontinuierlichen Weiterentwicklung der Technologie ist die Spracherkennungstechnologie zu einem wichtigen Bestandteil des Bereichs der künstlichen Intelligenz geworden. Das auf WebSocket und JavaScript basierende Online-Spracherkennungssystem zeichnet sich durch geringe Latenz, Echtzeit und plattformübergreifende Eigenschaften aus und hat sich zu einer weit verbreiteten Lösung entwickelt. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem implementieren.

WebSocket und JavaScript: Schlüsseltechnologien zur Realisierung von Echtzeit-Überwachungssystemen Einführung: Mit der rasanten Entwicklung der Internet-Technologie wurden Echtzeit-Überwachungssysteme in verschiedenen Bereichen weit verbreitet eingesetzt. Eine der Schlüsseltechnologien zur Erzielung einer Echtzeitüberwachung ist die Kombination von WebSocket und JavaScript. In diesem Artikel wird die Anwendung von WebSocket und JavaScript in Echtzeitüberwachungssystemen vorgestellt, Codebeispiele gegeben und deren Implementierungsprinzipien ausführlich erläutert. 1. WebSocket-Technologie

Einführung in die Verwendung von JavaScript und WebSocket zur Implementierung eines Online-Bestellsystems in Echtzeit: Mit der Popularität des Internets und dem Fortschritt der Technologie haben immer mehr Restaurants damit begonnen, Online-Bestelldienste anzubieten. Um ein Echtzeit-Online-Bestellsystem zu implementieren, können wir JavaScript und WebSocket-Technologie verwenden. WebSocket ist ein Vollduplex-Kommunikationsprotokoll, das auf dem TCP-Protokoll basiert und eine bidirektionale Kommunikation zwischen Client und Server in Echtzeit realisieren kann. Im Echtzeit-Online-Bestellsystem, wenn der Benutzer Gerichte auswählt und eine Bestellung aufgibt

So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript. Im heutigen digitalen Zeitalter müssen immer mehr Unternehmen und Dienste Online-Reservierungsfunktionen bereitstellen. Es ist von entscheidender Bedeutung, ein effizientes Online-Reservierungssystem in Echtzeit zu implementieren. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Reservierungssystem implementieren, und es werden spezifische Codebeispiele bereitgestellt. 1. Was ist WebSocket? WebSocket ist eine Vollduplex-Methode für eine einzelne TCP-Verbindung.

JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems Einführung: Heutzutage ist die Genauigkeit von Wettervorhersagen für das tägliche Leben und die Entscheidungsfindung von großer Bedeutung. Mit der Weiterentwicklung der Technologie können wir genauere und zuverlässigere Wettervorhersagen liefern, indem wir Wetterdaten in Echtzeit erhalten. In diesem Artikel erfahren Sie, wie Sie mit JavaScript und WebSocket-Technologie ein effizientes Echtzeit-Wettervorhersagesystem aufbauen. In diesem Artikel wird der Implementierungsprozess anhand spezifischer Codebeispiele demonstriert. Wir

JavaScript-Tutorial: So erhalten Sie HTTP-Statuscode. Es sind spezifische Codebeispiele erforderlich. Vorwort: Bei der Webentwicklung ist häufig die Dateninteraktion mit dem Server erforderlich. Bei der Kommunikation mit dem Server müssen wir häufig den zurückgegebenen HTTP-Statuscode abrufen, um festzustellen, ob der Vorgang erfolgreich ist, und die entsprechende Verarbeitung basierend auf verschiedenen Statuscodes durchführen. In diesem Artikel erfahren Sie, wie Sie mit JavaScript HTTP-Statuscodes abrufen und einige praktische Codebeispiele bereitstellen. Verwenden von XMLHttpRequest

Verwendung: In JavaScript wird die Methode insertBefore() verwendet, um einen neuen Knoten in den DOM-Baum einzufügen. Diese Methode erfordert zwei Parameter: den neuen Knoten, der eingefügt werden soll, und den Referenzknoten (d. h. den Knoten, an dem der neue Knoten eingefügt wird).

JavaScript ist eine in der Webentwicklung weit verbreitete Programmiersprache, während WebSocket ein Netzwerkprotokoll für die Echtzeitkommunikation ist. Durch die Kombination der leistungsstarken Funktionen beider können wir ein effizientes Echtzeit-Bildverarbeitungssystem erstellen. In diesem Artikel wird erläutert, wie dieses System mithilfe von JavaScript und WebSocket implementiert wird, und es werden spezifische Codebeispiele bereitgestellt. Zunächst müssen wir die Anforderungen und Ziele des Echtzeit-Bildverarbeitungssystems klären. Angenommen, wir haben ein Kameragerät, das Bilddaten in Echtzeit sammeln kann
