JavaScript Event Loop, tek iş parçacıklı (single-threaded) bir dilin asenkron işlemleri bloklamadan yürütmesini mümkün kılan runtime mekanizmasıdır. JavaScript Event Loop'u doğru anlamak, race condition'ları, mikrotask önceliklendirmesini ve beklenmeyen yürütme sıralarını anlamlandırmanın önkoşuludur.\n\nJavaScript Event Loop'un yapısı dört bileşenden oluşur: Call Stack (çalıştırılan fonksiyonların LIFO yığını), Web API'leri (setTimeout, fetch gibi tarayıcı sağlayan asenkron işlevler), Callback Queue (Macrotask Queue) ve Microtask Queue. Yürütme sırası şöyle işler: Call Stack boşaldığında, önce Microtask Queue'daki tüm görevler tükenir, ardından Callback Queue'dan bir macrotask alınarak Stack'e itilir.\n\nBu ayrım pratik sonuçlar doğurur: `Promise.resolve().then(...)` bir microtask, `setTimeout(() => ..., 0)` ise bir macrotask üretir. Her ikisi de „sıfır gecikmeli\" yazılmış olsa da Promise callback'i daima `setTimeout` callback'inden önce çalışır. JavaScript Event Loop'un bu davranışını anlamadan yazılan asenkron kod, öngörülemeyen yürütme sıralarına ve zor yakalanabilir hatalara yol açar.\n\n`async/await` sözdizimi, Promise zincirlerini lineer görünümlü kod olarak yazmanın syntactic sugar'ıdır; arka planda yine microtask kuyruğunu kullanır. `await` ifadesi, o satırın altında kalan kodu bir microtask olarak yeniden planlar ve kontrol JavaScript Event Loop'a geri döner. Bu nedenle uzun süren CPU yoğun işlemlerde `await` bir çözüm değildir; gerçek paralel işlem için Web Worker gerekir.