نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر

نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
JS

منهج JavaScript

دليل مرجعي شامل

كل اللغات
مدرسة البرمجة/منهج JavaScript/مفهوم الـ Asynchronous وطابور الأحداث (Event Loop)

مفهوم الـ Asynchronous وطابور الأحداث (Event Loop)

event loop javascriptالبرمجة غير المتزامنةasynchronous javascriptcall stack task queuemicrotask queue

جدول مرجعي سريع

1
المفهومالتعريف
Call Stackمكان تنفيذ الكود المتزامن سطراً بسطر
Task Queueطابور مهام setTimeout والأحداث العادية
Microtask Queueطابور Promises، أولوية أعلى من Task Queue
Event Loopالآلية التي تُنقل المهام من الطوابير للمكدس عند فراغه

الشرح

جافاسكريبت لغة أحادية الخيط (Single-Threaded)، أي أنها تُنفذ سطراً واحداً من الكود في وقت واحد فقط، ولا يمكنها تنفيذ سطرين في نفس اللحظة بالضبط. لكن هذا لا يعني أنها بطيئة أو معطّلة عند انتظار عمليات تستغرق وقتاً (كجلب بيانات من خادم أو انتظار مؤقت) — وهنا يأتي دور البرمجة غير المتزامنة (Asynchronous Programming).

المحرك الذي يجعل هذا ممكناً يُسمى Event Loop (طابور الأحداث)، وهو آلية تعمل في الخلفية باستمرار تراقب "مكدس الاستدعاء" (Call Stack) — وهو المكان الذي تُنفَّذ فيه الأكواد المتزامنة سطراً بسطر — و"طابور المهام" (Task Queue أو Callback Queue) الذي يحتوي الدوال الجاهزة للتنفيذ بعد انتهاء عملية غير متزامنة (مثل انتهاء مؤقت أو وصول استجابة من الخادم).

قاعدة Event Loop الذهبية: لا تُنقل أي مهمة من طابور المهام إلى مكدس الاستدعاء للتنفيذ إلا إذا كان المكدس فارغاً تماماً — أي أن كل الكود المتزامن (Synchronous) في البرنامج ينتهي أولاً قبل تنفيذ أي كود غير متزامن مُعلَّق، حتى لو كان ذلك الكود جاهزاً للتنفيذ منذ فترة. هذا يُفسر لماذا setTimeout(fn, 0) لا يُنفذ فوراً رغم أن التأخير صفر مللي ثانية — يجب أن ينتظر حتى ينتهي كل الكود المتزامن الحالي أولاً.

توجد أيضاً طوابير أعلى أولوية تُسمى "Microtask Queue" (مثل Promises)، والتي تُعالَج بالكامل قبل أي مهمة في طابور المهام العادي (مثل setTimeout)، حتى لو كانت جاهزة قبلها زمنياً. فهم هذا الترتيب (Call Stack أولاً، ثم Microtasks، ثم Task Queue العادي) ضروري جداً لتوقع سلوك الكود غير المتزامن بدقة.

الصياغة (Syntax)

syntax
1console.log("1"); // متزامن، فوري
2
3setTimeout(() => {
4 console.log("2"); // غير متزامن، يذهب لطابور المهام
5}, 0);
6
7Promise.resolve().then(() => {
8 console.log("3"); // غير متزامن، لكن Microtask بأولوية أعلى
9});
10
11console.log("4"); // متزامن، فوري
12
13// الترتيب الفعلي في الطباعة: 1, 4, 3, 2

أمثلة عملية

مثال 1: إثبات أولوية الكود المتزامن

إثبات أولوية الكود المتزامن
1// إثبات: كل الكود المتزامن ينتهي أولاً مهما كان التأخير صفراً
2console.log("بداية البرنامج");
3
4setTimeout(() => {
5 console.log("من setTimeout بتأخير 0");
6}, 0);
7
8for (let i = 0; i < 3; i++) {
9 console.log("حلقة متزامنة:", i);
10}
11
12console.log("نهاية الكود المتزامن");
13// setTimeout يُطبع دائماً في النهاية رغم تأخيره صفر

مثال 2: أولوية Microtask Queue على Task Queue

أولوية Microtask Queue على Task Queue
1// أولوية Microtasks (Promises) على Task Queue العادي (setTimeout)
2setTimeout(() => console.log("Timeout"), 0);
3Promise.resolve().then(() => console.log("Promise"));
4console.log("متزامن");
5
6// الترتيب: "متزامن" ثم "Promise" ثم "Timeout"
7// رغم أن كليهما غير متزامن، الـ Promise له أولوية أعلى

نصائح احترافية

  • —جافاسكريبت أحادية الخيط دائماً — البرمجة غير المتزامنة لا تعني تعدد الخيوط الحقيقي، بل جدولة ذكية للمهام.
  • —كل الكود المتزامن يُنفَّذ بالكامل أولاً قبل أي كود غير متزامن، مهما كان تأخير setTimeout صفراً.
  • —Promises (Microtasks) لها أولوية أعلى من setTimeout (Task Queue العادي) دائماً.
  • —فهم Event Loop ضروري لتصحيح أخطاء الترتيب الشائعة في الكود غير المتزامن المعقد.

الدرس السابق

الكلمة المحجوزة `this` وفهم سلوكها

الدرس التالي

دوال التوقيت (setTimeout & setInterval)

نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر