🔄Wie JavaScript läuft: die Event Loop
JavaScript hat einen einzigen Call Stack. Asynchrones (Timer, Netzwerk, Events) übernimmt die Umgebung und stellt die Callbacks in Warteschlangen. Wähle ein Programm und gehe Schritt für Schritt durch: Codezeile, Stack, Queues und Konsole werden live angezeigt.
🐞Schritt-Debugger
1console.log("1: Skript");2setTimeout(() => console.log("4: Timeout"), 0);3Promise.resolve().then(() => console.log("3: then"));4console.log("2: Skript-Ende");
Das Skript wird als erster Task gestartet: der globale Ausführungskontext liegt auf dem Call Stack.
🧭Die Regeln
📚 Call Stack & Heap
Der Call Stack enthält die gerade laufenden Funktionen (Frames). Objekte liegen im Heap. Solange etwas auf dem Stack liegt, läuft nichts anderes – JavaScript ist „run to completion“.
⚡ Microtasks
Promise-Reaktionen (then/catch/finally), Fortsetzungen nach await und queueMicrotask. Werden nach jedem Task vollständig abgearbeitet – auch neu hinzukommende. Endlos neue Microtasks blockieren deshalb die Seite.
⏰ Tasks (Macrotasks)
Abgelaufene Timer (setTimeout, setInterval), Ereignisse (Klick, Netzwerk), MessageChannel. Pro Runde genau ein Task, danach wieder alle Microtasks, dann ggf. Rendern.
while (true) {
task = taskQueue.nächster() // z. B. Skript, Timer, Klick
führeAus(task) // läuft bis der Stack leer ist
while (microtaskQueue.nichtLeer())
führeAus(microtaskQueue.nächster())
if (Browser && Zeit für Frame)
requestAnimationFrame-Callbacks, Style, Layout, Paint
}process.nextTick, das sogar vor Promise-Microtasks läuft.