CodeShot
Midسختی 4 از ۵· در 78٪ مصاحبه‌های این حوزه پرسیده شده

Event Loop در جاوااسکریپت چیست و چرا این زبان با وجود Single-Threaded بودن، ناهمگام (Async) کار می‌کند؟

نشان کردن

پاسخ کوتاه

Event Loop صف کارهای Async (تایمر، شبکه، Promise) را زمانی که Call Stack خالی شد، یکی‌یکی به Call Stack اضافه می‌کند؛ همین باعث می‌شود بدون Thread واقعی، رفتار ناهمگام شبیه‌سازی شود.

پاسخ کامل

جاوااسکریپت روی یک Call Stack واحد اجرا می‌شود، اما کارهای کند (شبکه، تایمر، خواندن فایل) را به مرورگر/Node.js می‌سپارد. وقتی آن کار تمام شد، Callback یا resolve مربوطه به یک صف اضافه می‌شود (Microtask Queue برای Promise، Macrotask Queue برای setTimeout).

Event Loop مدام بررسی می‌کند: آیا Call Stack خالی است؟ اگر بله، اول تمام Microtaskها را اجرا می‌کند، سپس یک Macrotask را برمی‌دارد. همین چرخه ساده، توهم اجرای هم‌زمان چند کار را می‌سازد — بدون اینکه واقعاً چند Thread درگیر باشد.

مثال کد

console.log("1");
setTimeout(() => console.log("2"), 0);
Promise.resolve().then(() => console.log("3"));
console.log("4");

// خروجی: 1, 4, 3, 2
// چون Promise (Microtask) همیشه قبل از setTimeout (Macrotask) اجرا می‌شود.

نکته مهم

منبع کامل موضوع: The event loop — MDN Web Docs.

اشتباه رایج

❌ فکرکردن به اینکه setTimeout(fn, 0) بلافاصله اجرا می‌شود — همیشه بعد از تمام‌شدن کد همگام فعلی و صف Microtask اجرا می‌شود.