suchen
HeimWeb-Frontendjs-TutorialJS-Browser-Ereignisschleifenmechanismus

JS-Browser-Ereignisschleifenmechanismus

Jul 07, 2018 pm 05:11 PM
javascript前端浏览器

In diesem Artikel wird hauptsächlich der JS-Browser-Ereignisschleifenmechanismus vorgestellt, der einen gewissen Referenzwert hat. Jetzt können Freunde in Not darauf zurückgreifen.

Lassen Sie uns zunächst einige konzeptionelle Inhalte verstehen.

Prozess, Thread

  • Ein Prozess ist eine vom System zugewiesene unabhängige Ressource und die Grundeinheit der CPU-Ressourcenzuweisung. Ein Prozess besteht aus einem oder mehreren Threads.

  • Thread ist der Ausführungsfluss eines Prozesses und die Grundeinheit der CPU-Planung und -Verteilung. Mehrere Threads im selben Prozess teilen sich die Ressourcen des Prozesses.

Browserkernel

  • Der Browser ist ein Multiprozess-Browser, und jede Registerkartenbezeichnung im Browser stellt einen unabhängigen Prozess dar (nicht unbedingt, da mehrere). leere Tab-Beschriftungen werden zu einem Prozess zusammengeführt), der Browser-Kernel (Browser-Rendering-Prozess) ist einer der Multiprozesse des Browsers.

  • Im Browserkernel arbeiten mehrere Threads.

    • Wenn Sie eine HTTP-Anfrage stellen, wird ein Anfragethread geöffnet.

    • Nachdem die Anfrage abgeschlossen ist und das Ergebnis erhalten wurde, fügen Sie die angeforderte Rückruffunktion zur Aufgabenwarteschlange hinzu und warten Sie auf die Verarbeitung durch die JS-Engine.

    • Der Browser-Timing-Zähler wird von der JS-Engine nicht gezählt und das Blockieren führt zu einem ungenauen Timing.

    • Aktivieren Sie den Timer-Trigger-Thread, um die Zeitmessung durchzuführen und auszulösen. Nachdem die Zeitmessung abgeschlossen ist, wird sie zur Aufgabenwarteschlange hinzugefügt und wartet auf die Verarbeitung durch die JS-Engine.

    • Wenn ein Ereignis die Auslösebedingungen erfüllt und ausgelöst wird, fügt der Thread die entsprechende Ereignisrückruffunktion am Ende der Aufgabenwarteschlange hinzu und wartet auf die Verarbeitung durch die JS-Engine.

    • Single-Threaded-Arbeit, verantwortlich für das Parsen und Ausführen von JavaScript-Skripten.

    • und der GUI-Rendering-Thread schließen sich gegenseitig aus. Wenn die Ausführung von JS zu lange dauert, wird die Seite blockiert.

    • ist für das Rendern der Seite, das Parsen von HTML, CSS zur Bildung eines DOM-Baums usw. verantwortlich. Dieser Thread wird aufgerufen, wenn die Seite neu gezeichnet wird oder ein Reflow durch einen Vorgang verursacht wird.

    • und der JS-Engine-Thread schließen sich gegenseitig aus. Wenn der JS-Engine-Thread funktioniert, wird der GUI-Rendering-Thread angehalten und das GUI-Update wird in die JS-Aufgabenwarteschlange gestellt. wartet. Der JS-Engine-Thread setzt die Ausführung fort, wenn er inaktiv ist.

    • GUI-Rendering-Thread:

    • JS-Engine-Thread:

    • Ereignisauslösender Thread:

    • Timer-Trigger-Thread:

    • http-Anfrage-Thread:

JS-Browser-Ereignisschleifenmechanismus

Die JavaScript-Engine ist Single-Threaded

Die JavaScript-Engine ist Single-Threaded, was bedeutet, dass jeweils nur eine Aufgabe ausgeführt werden kann und andere Aufgaben in die Warteschlange gestellt werden müssen, um ausgeführt zu werden. Nur die aktuelle Aufgabe wird ausgeführt. Nach Abschluss wird die nächste Aufgabe ausgeführt.

Die Web-Worker-API wird in HTML5 hauptsächlich zur Lösung des Problems der Seitenblockierung vorgeschlagen, ändert jedoch nichts an der Single-Threaded-Natur von JavaScript. Erfahren Sie mehr über Web-Worker.

JavaScript-Ereignisschleifenmechanismus

Der JavaScript-Ereignisschleifenmechanismus ist in Browser- und Node-Ereignisschleifenmechanismen unterteilt. Die Implementierungstechnologien der beiden sind unterschiedlich Die Ereignisschleife wird von der libuv-Bibliothek implementiert. Das Hauptaugenmerk liegt hier auf dem Browser-Teil.

Javascript verfügt über einen Hauptthread und einen Call-Stack (Ausführungsstack). Alle Aufgaben werden auf dem Call-Stack abgelegt, um auf die Ausführung des Haupt-Threads zu warten.

  • JS-Aufrufstapel

    JS-Aufrufstapel ist eine Last-In-First-Out-Datenstruktur. Wenn eine Funktion aufgerufen wird, wird sie oben auf dem Stapel hinzugefügt. Nach Abschluss der Ausführung wird die Funktion vom oberen Rand des Stapels entfernt, bis der Stapel gelöscht wird.

  • Synchrone Aufgaben, asynchrone Aufgaben

    Die Aufgaben im JavaScript-Einzelthread sind in synchrone Aufgaben und asynchrone Aufgaben unterteilt. Synchrone Aufgaben werden der Reihe nach im Aufrufstapel in die Warteschlange gestellt und warten auf die Ausführung durch den Hauptthread, während asynchrone Aufgaben die registrierte Rückruffunktion zur Aufgabenwarteschlange (Nachrichtenwarteschlange) hinzufügen, nachdem das asynchrone Ergebnis verfügbar ist, und auf die Ausführung durch den Hauptthread warten im Leerlauf, also im Stapel. Wenn es gelöscht ist, wird es in den Stapel eingelesen und wartet auf die Ausführung durch den Hauptthread. Die Aufgabenwarteschlange ist eine First-In-First-Out-Datenstruktur.

  • Ereignisschleife

    Die Synchronisierungsaufgaben im Aufrufstapel wurden ausgeführt und der Stapel wurde gelöscht, was bedeutet, dass der Hauptthread zu diesem Zeitpunkt inaktiv ist. Es wird in die Aufgabenwarteschlange gestellt. Eine Aufgabe wird der Reihe nach gelesen und zur Ausführung auf dem Stapel abgelegt. Jedes Mal, wenn der Stapel geleert wird, wird gelesen, ob sich Aufgaben in der Aufgabenwarteschlange befinden. Wenn Aufgaben vorhanden sind, werden sie gelesen und ausgeführt. Der Lese- und Ausführungsvorgang bildet eine Ereignisschleife.

JS-Browser-Ereignisschleifenmechanismus

JS-Browser-Ereignisschleifenmechanismus

  • Timer

    Der Timer startet einen Timer Der Timer löst den Thread aus, um das Timing auszulösen. Nach dem Warten auf die angegebene Zeit stellt der Timer das Ereignis in die Aufgabenwarteschlange und wartet darauf, dass es vom Hauptthread gelesen und ausgeführt wird.

    Die vom Timer angegebene Verzögerung in Millisekunden ist tatsächlich nicht genau, da der Timer das Ereignis erst dann in die Aufgabenwarteschlange einfügt, wenn die angegebene Zeit erreicht ist, und warten muss, bis die synchronisierte Aufgabe und das Ereignis in der vorhandenen Aufgabenwarteschlange vorhanden sind Wenn alle Ausführungen abgeschlossen sind, werden die Timer-Ereignisse im Hauptthread gelesen und ausgeführt. Es kann vorkommen, dass Aufgaben in der Mitte lange dauern, sodass die Ausführung zum angegebenen Zeitpunkt nicht garantiert werden kann.

  • Makroaufgabe (Makroaufgabe), Mikroaufgabe (Mikroaufgabe)

    Neben verallgemeinerten synchronen Aufgaben und asynchronen Aufgaben auch Aufgaben in einer JavaScript-Einzelaufgabe Der Thread kann detailliert in Makroaufgaben und Mikroaufgaben unterteilt werden.

    Makroaufgabe umfasst: Skript (Gesamtcode), setTimeout, setInterval, setImmediate, I/O, UI-Rendering.

    Mikroaufgabe umfasst: Process.nextTick, Promises, Object.observe, MutationObserver.

        console.log(1);
        setTimeout(function() {
            console.log(2);
        })
        var promise = new Promise(function(resolve, reject) {
            console.log(3);
            resolve();
        })
        promise.then(function() {
            console.log(4);
        })
        console.log(5);

    Im Beispiel werden setTimeout und Promise als Aufgabenquellen bezeichnet, und von verschiedenen Aufgabenquellen registrierte Rückruffunktionen werden in verschiedene Aufgabenwarteschlangen gestellt.

    Nachdem wir die Konzepte von Makroaufgaben und Mikroaufgaben kennengelernt haben, wie ist die Ausführungsreihenfolge von JS? Sollten Makroaufgaben oder Mikroaufgaben an erster Stelle stehen?

    In der ersten Ereignisschleife führt die JavaScript-Engine den gesamten Skriptcode als Makrotask aus. Nach Abschluss der Ausführung erkennt sie, ob sich in dieser Schleife eine Mikrotask befindet, und startet sie Nachdem alle Mikrotasks in der Aufgabenwarteschlange gelesen und ausgeführt wurden, werden die Aufgaben in der Aufgabenwarteschlange der Makrotask gelesen und ausgeführt, und dann werden alle Mikrotasks ausgeführt und so weiter. Die Ausführungssequenz von JS besteht aus Makroaufgaben und Mikroaufgaben in jeder Ereignisschleife.

    • Im obigen Beispiel gelangt der gesamte Code in der ersten Ereignisschleife als Makroaufgabe zur Ausführung in den Hauptthread.

    • Wenn setTimeout auftritt, wartet es, bis die angegebene Zeit abgelaufen ist, und stellt die Rückruffunktion in die Aufgabenwarteschlange der Makroaufgabe.

    • Wenn Sie auf ein Versprechen stoßen, fügen Sie die Funktion then in die Aufgabenwarteschlange der Mikroaufgabe ein.

    • Nachdem die gesamte Ereignisschleife abgeschlossen ist, erkennt es, ob sich eine Aufgabe in der Aufgabenwarteschlange der Mikrotask befindet, und führt sie aus, falls vorhanden.

    • Das Ergebnis der ersten Schleife wird wie folgt gedruckt: 1,3,5,4.

    • Gehen Sie dann zur Aufgabenwarteschlange der Makroaufgabe, nehmen Sie eine Makroaufgabe heraus und legen Sie sie auf den Stapel, damit der Hauptthread sie ausführen kann. Anschließend wird die Makroaufgabe in dieser Schleife ausgeführt ist die von setTimeout registrierte Rückruffunktion. Nach der Ausführung dieser Rückruffunktion wird festgestellt, dass sich in dieser Schleife keine Mikrotasks befinden, und wir sind bereit für die nächste Ereignisschleife.

    • Wenn festgestellt wird, dass in der Makroaufgabenwarteschlange keine auszuführenden Aufgaben vorhanden sind, wird die Ereignisschleife beendet.

    • Das Endergebnis ist 1,3,5,4,2.

    Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

    Verwandte Empfehlungen:

    JS-Timer und asynchrone Single-Thread-Funktionen

Das obige ist der detaillierte Inhalt vonJS-Browser-Ereignisschleifenmechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Von C/C nach JavaScript: Wie alles funktioniertVon C/C nach JavaScript: Wie alles funktioniertApr 14, 2025 am 12:05 AM

Die Verschiebung von C/C zu JavaScript erfordert die Anpassung an dynamische Typisierung, Müllsammlung und asynchrone Programmierung. 1) C/C ist eine statisch typisierte Sprache, die eine manuelle Speicherverwaltung erfordert, während JavaScript dynamisch eingegeben und die Müllsammlung automatisch verarbeitet wird. 2) C/C muss in den Maschinencode kompiliert werden, während JavaScript eine interpretierte Sprache ist. 3) JavaScript führt Konzepte wie Verschlüsse, Prototypketten und Versprechen ein, die die Flexibilität und asynchrone Programmierfunktionen verbessern.

JavaScript -Engines: Implementierungen vergleichenJavaScript -Engines: Implementierungen vergleichenApr 13, 2025 am 12:05 AM

Unterschiedliche JavaScript -Motoren haben unterschiedliche Auswirkungen beim Analysieren und Ausführen von JavaScript -Code, da sich die Implementierungsprinzipien und Optimierungsstrategien jeder Engine unterscheiden. 1. Lexikalanalyse: Quellcode in die lexikalische Einheit umwandeln. 2. Grammatikanalyse: Erzeugen Sie einen abstrakten Syntaxbaum. 3. Optimierung und Kompilierung: Generieren Sie den Maschinencode über den JIT -Compiler. 4. Führen Sie aus: Führen Sie den Maschinencode aus. V8 Engine optimiert durch sofortige Kompilierung und versteckte Klasse.

Jenseits des Browsers: JavaScript in der realen WeltJenseits des Browsers: JavaScript in der realen WeltApr 12, 2025 am 12:06 AM

Zu den Anwendungen von JavaScript in der realen Welt gehören die serverseitige Programmierung, die Entwicklung mobiler Anwendungen und das Internet der Dinge. Die serverseitige Programmierung wird über node.js realisiert, die für die hohe gleichzeitige Anfrageverarbeitung geeignet sind. 2. Die Entwicklung der mobilen Anwendungen erfolgt durch reaktnative und unterstützt die plattformübergreifende Bereitstellung. 3.. Wird für die Steuerung von IoT-Geräten über die Johnny-Five-Bibliothek verwendet, geeignet für Hardware-Interaktion.

Erstellen einer SaaS-Anwendung mit mehreren Mietern mit Next.js (Backend Integration)Erstellen einer SaaS-Anwendung mit mehreren Mietern mit Next.js (Backend Integration)Apr 11, 2025 am 08:23 AM

Ich habe eine funktionale SaaS-Anwendung mit mehreren Mandanten (eine EdTech-App) mit Ihrem täglichen Tech-Tool erstellt und Sie können dasselbe tun. Was ist eine SaaS-Anwendung mit mehreren Mietern? Mit Multi-Tenant-SaaS-Anwendungen können Sie mehrere Kunden aus einem Sing bedienen

So erstellen Sie eine SaaS-Anwendung mit mehreren Mietern mit Next.js (Frontend Integration)So erstellen Sie eine SaaS-Anwendung mit mehreren Mietern mit Next.js (Frontend Integration)Apr 11, 2025 am 08:22 AM

Dieser Artikel zeigt die Frontend -Integration mit einem Backend, das durch die Genehmigung gesichert ist und eine funktionale edtech SaaS -Anwendung unter Verwendung von Next.js. erstellt. Die Frontend erfasst Benutzerberechtigungen zur Steuerung der UI-Sichtbarkeit und stellt sicher, dass API-Anfragen die Rollenbasis einhalten

JavaScript: Erforschung der Vielseitigkeit einer WebspracheJavaScript: Erforschung der Vielseitigkeit einer WebspracheApr 11, 2025 am 12:01 AM

JavaScript ist die Kernsprache der modernen Webentwicklung und wird für seine Vielfalt und Flexibilität häufig verwendet. 1) Front-End-Entwicklung: Erstellen Sie dynamische Webseiten und einseitige Anwendungen durch DOM-Operationen und moderne Rahmenbedingungen (wie React, Vue.js, Angular). 2) Serverseitige Entwicklung: Node.js verwendet ein nicht blockierendes E/A-Modell, um hohe Parallelitäts- und Echtzeitanwendungen zu verarbeiten. 3) Entwicklung von Mobil- und Desktop-Anwendungen: Die plattformübergreifende Entwicklung wird durch reaktnative und elektronen zur Verbesserung der Entwicklungseffizienz realisiert.

Die Entwicklung von JavaScript: Aktuelle Trends und ZukunftsaussichtenDie Entwicklung von JavaScript: Aktuelle Trends und ZukunftsaussichtenApr 10, 2025 am 09:33 AM

Zu den neuesten Trends im JavaScript gehören der Aufstieg von Typenkripten, die Popularität moderner Frameworks und Bibliotheken und die Anwendung der WebAssembly. Zukunftsaussichten umfassen leistungsfähigere Typsysteme, die Entwicklung des serverseitigen JavaScript, die Erweiterung der künstlichen Intelligenz und des maschinellen Lernens sowie das Potenzial von IoT und Edge Computing.

Entmystifizieren JavaScript: Was es tut und warum es wichtig istEntmystifizieren JavaScript: Was es tut und warum es wichtig istApr 09, 2025 am 12:07 AM

JavaScript ist der Eckpfeiler der modernen Webentwicklung. Zu den Hauptfunktionen gehören eine ereignisorientierte Programmierung, die Erzeugung der dynamischen Inhalte und die asynchrone Programmierung. 1) Ereignisgesteuerte Programmierung ermöglicht es Webseiten, sich dynamisch entsprechend den Benutzeroperationen zu ändern. 2) Die dynamische Inhaltsgenerierung ermöglicht die Anpassung der Seiteninhalte gemäß den Bedingungen. 3) Asynchrone Programmierung stellt sicher, dass die Benutzeroberfläche nicht blockiert ist. JavaScript wird häufig in der Webinteraktion, der einseitigen Anwendung und der serverseitigen Entwicklung verwendet, wodurch die Flexibilität der Benutzererfahrung und die plattformübergreifende Entwicklung erheblich verbessert wird.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

VSCode Windows 64-Bit-Download

VSCode Windows 64-Bit-Download

Ein kostenloser und leistungsstarker IDE-Editor von Microsoft

Dreamweaver Mac

Dreamweaver Mac

Visuelle Webentwicklungstools

MinGW – Minimalistisches GNU für Windows

MinGW – Minimalistisches GNU für Windows

Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

SAP NetWeaver Server-Adapter für Eclipse

SAP NetWeaver Server-Adapter für Eclipse

Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.