تخيل أن JavaScript لديه مساعدون سريون. أولاً، لدينا «مكدس الاستدعاءات» (Call Stack)، وهو مثل قائمة المهام التي يقوم JavaScript بتنفيذها فورًا، بالترتيب الذي تأتي به. عندما تنتهي مهمة، يتم إزالتها من المكدس. ولكن ماذا عن المهام التي تستغرق وقتًا، مثل جلب البيانات من الإنترنت أو مؤقتات العد التنازلي؟ هنا يأتي دور «واجهات برمجة تطبيقات الويب» (Web APIs)، وهي ميزات يوفرها المتصفح (أو بيئة Node.js) مثل 'setTimeout' أو أحداث DOM (مثل النقر على زر) أو طلبات HTTP. هذه الواجهات تعمل بشكل مستقل عن المكدس الرئيسي.
بمجرد انتهاء عملية غير متزامنة (asynchronous operation) بدأتها واجهة برمجة تطبيقات الويب، لا يتم إرسالها مباشرة إلى مكدس الاستدعاءات. بدلاً من ذلك، يتم وضع «وظيفة الاستدعاء» (callback) الخاصة بها في «قائمة انتظار الاستدعاءات» (Callback Queue). ولكن هناك قائمة انتظار أخرى ذات أولوية أعلى تُسمى «قائمة انتظار المهام المصغرة» (Microtask Queue)، والتي تحتوي على مهام مثل ردود فعل الوعود (Promise callbacks) والمراقبين. يتم معالجة هذه المهام المصغرة فورًا بعد أن يصبح مكدس الاستدعاءات فارغًا.
هنا يتدخل «حلقة الأحداث». إنها تراقب باستمرار مكدس الاستدعاءات وقوائم الانتظار. عندما يصبح مكدس الاستدعاءات فارغًا (مما يعني أن JavaScript قد انتهى من جميع المهام الفورية)، تقوم حلقة الأحداث أولاً بالتحقق من قائمة انتظار المهام المصغرة وتنفيذ كل ما فيها. بعد ذلك، إذا كان مكدس الاستدعاءات لا يزال فارغًا، فإنها تأخذ المهمة التالية من قائمة انتظار الاستدعاءات وتدفعها إلى مكدس الاستدعاءات لتنفيذها. وتستمر هذه الدورة بلا توقف. هذا التنسيق الذكي يضمن أن JavaScript يمكنه معالجة المهام المعقدة في الخلفية دون تجميد واجهة المستخدم، مما يمنحك تجربة تصفح سلسة وسريعة.