I'm always excited to take on new projects and collaborate with innovative minds.

Phone

+20 115 052 9992

Website

https://ibrahimahmed.online/

Social Links

ازاي تفهم الـ Event Loop وتخلي كود الجافا سكريبت طيارة؟

ازاي تفهم الـ Event Loop وتخلي كود الجافا سكريبت طيارة؟ أكيد مريت بالموقف ده: بتكتب كود جافا سكريبت (JavaScript) وبتحاول تعمل حاجة بسيطة، فجأة تلاقي المتصفح (Br

ازاي تفهم الـ Event Loop وتخلي كود الجافا سكريبت طيارة؟
Reading Count: 5

ازاي تفهم الـ Event Loop وتخلي كود الجافا سكريبت طيارة؟

أكيد مريت بالموقف ده: بتكتب كود جافا سكريبت (JavaScript) وبتحاول تعمل حاجة بسيطة، فجأة تلاقي المتصفح (Browser) هنج أو الـ UI بقى تقيل ومبيستجبش لأي كليك. السؤال اللي بيحير أي مبرمج، هو إزاي لغة بتشتغل بخيط تنفيذ واحد (Single-threaded) بتقدر تعمل عمليات تقيلة زي جلب البيانات من الـ API من غير ما توقف الموقع كله؟ السر كله في حاجة اسمها حلقة الأحداث (Event Loop).

يعني إيه Single-threaded وإيه مشكلة الـ Blocking؟

الجافا سكريبت بتنفذ الأوامر سطر ورا سطر. لو عندك عملية بتاخد وقت طويل، زي قراءة ملف كبير أو طلب شبكة (Network Request)، الكود هيقف ويستنى العملية دي تخلص قبل ما ينفذ السطر اللي بعده. ده اللي بنسميه الـ Blocking. الـ Event Loop هي المنظم اللي بيخلينا نخدع المتصفح ونخليه يشتغل "أكنه" بيعمل كذا حاجة في وقت واحد (Asynchronous) عن طريق رمي المهام التقيلة دي للمتصفح نفسه ينفذها، ويرجع لنا النتيجة لما يخلص.

مكونات اللعبة: Call Stack و Task Queue

عشان تفهم اللعبة دي، لازم تعرف الأبطال بتوعنا:

  • مكدس التنفيذ (Call Stack): ده المكان اللي الجافا سكريبت بتحط فيه الفانكشن اللي عليها الدور تتنفذ دلوقتي.
  • طابور المهام (Callback Queue): ده "غرفة الانتظار" اللي بتروح فيها الكود بتاع الـ Callback بعد ما المهام غير المتزامنة تخلص.
  • حلقة الأحداث (Event Loop): ده "الحارس" اللي بيراقب الـ Call Stack لو فاضي، يسحب من الـ Queue ويحط في الـ Stack.

الفرق الجوهري بين الـ Macro-tasks والـ Micro-tasks

هنا بقى التريكة اللي بتقع فيها أغلب المبرمجين. المهام مش كلها زي بعضها. فيه تقسيم بيتحكم في ترتيب التنفيذ:

1. المهام الكبيرة (Macro-tasks): زي الـ setTimeout، الـ setInterval، والـ I/O. دي بتتحط في الـ Task Queue العادي.

2. المهام الدقيقة (Micro-tasks): زي الـ Promises، و MutationObserver. دي ليها "طابور خاص" (Microtask Queue) والأولوية فيه أعلى بكتير من الـ Macro-tasks.

مثال عملي يوضح الترتيب


console.log('1: ستارت');

setTimeout(() => {
  console.log('2: setTimeout (Macro-task)');
}, 0);

Promise.resolve().then(() => {
  console.log('3: Promise (Micro-task)');
});

console.log('4: إند');

لو شغلت الكود ده، النتيجة هتكون:

1: ستارت

4: إند

3: Promise (Micro-task)

2: setTimeout (Macro-task)

لاحظت؟ رغم إن setTimeout متحدد لها وقت 0، بس الـ Promise اتنفذت قبلها لأن الـ Micro-tasks بتتحرق وتتنفذ فوراً بعد ما الـ Stack يفضى، وقبل ما أي Macro-task يبدأ!

إزاي تتجنب بطء المتصفح؟

عشان تخلي تطبيقك سريع، حاول دايماً:

  • ما تحطش عمليات حسابية معقدة جداً (Heavy CPU tasks) داخل الـ Main thread.
  • استخدم الـ Web Workers لو عندك معالجة بيانات ضخمة.
  • اعرف إن كتر الـ Micro-tasks ممكن "يسحل" المتصفح ويمنعه يعمل Rendering، فاستخدمهم بذكاء.

نصيحة من أخ

الـ Event Loop مش مجرد نظرية تقرأها وتعدي، دي "الموتور" اللي بيحرك كودك. نصيحتي ليك: ما تعتمدش على حفظ الترتيب، جرب بنفسك وافتح الـ Console في المتصفح، وغير ترتيب الكود وشوف النتائج. الممارسة هي اللي هتحول المعلومات دي لـ "حدس" برمجي يخليك تكتب كود أنظف وأسرع بكتير. كمل مذاكرة، وابني مشاريع، وخليك دايماً فضولي تعرف الكود اللي بتكتبه بيحصل فيه إيه "تحت الكبوت"!


Share

Related posts

Jun 22, 2026 • 1 min read
Reading Count: 5
هل لسه في مكان لـ jQuery في 2026؟ نظرة واقعية على تطوير الويب

هل لسه في مكان لـ jQuery في 2026؟ نظرة واقعية على تطوير الويب أكيد مريت بالموقف ده: مشروع قديم (Lega...

Jun 21, 2026 • 1 min read
Reading Count: 6
وداعاً لـ Moment.js و Day.js: مستقبل التعامل مع التواريخ باستخدام Temporal API

وداعاً لـ Moment.js و Day.js: مستقبل التعامل مع التواريخ باستخدام Temporal API لو كنت مبرمج JavaScri...

Jun 21, 2026 • 1 min read
Reading Count: 7
وداعاً لـ build_runner: مستقبل Dart مع الـ Macros وتوليد الكود التلقائي

وداعاً لـ build_runner: مستقبل Dart مع الـ Macros وتوليد الكود التلقائي أكيد مبرمج فلاتر (Flutter) أ...