0Pricing
JavaScript Academy · درس

مكدس الاستدعاءات

شاهدوا كيفية تتبّع استدعاءات الدوال.

مكدس الاستدعاءات درس مجاني في JavaScript Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في JavaScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة JavaScript Academy 4 دروس في المجموع.

ما مكدس الاستدعاءات؟

إن مكدس الاستدعاءات هو الطريقة التي يتتبع بها JavaScript الدالة قيد التشغيل حاليًا والمكان الذي يجب العودة إليه. يُضاف كل استدعاء دالة إلى قمة المكدس، وعند انتهائه يُزال منها.

وهو بنية LIFO: آخر ما يدخل هو أول ما يخرج.

الدفع والإزالة من المكدس

عند استدعاء دالة، يُدفَع إطار إلى المكدس. وعند إرجاعها، يُزال الإطار. راقب ترتيب السجلات عندما تتداخل الاستدعاءات.

function first() {
  console.log('first start');
  second();
  console.log('first end');
}

function second() {
  console.log('second');
}

first();

تطبيق LIFO عمليًا

يجب أن تنتهي الدالة التي استُدعيت مؤخرًا قبل أن تستأنف الدالة الموجودة أسفلها عملها. يكتمل الاستدعاء الداخلي أولًا، مع أنه بدأ أخيرًا.

function a() {
  console.log('enter a');
  b();
  console.log('exit a');
}
function b() {
  console.log('enter b');
  c();
  console.log('exit b');
}
function c() {
  console.log('c runs');
}
a();

التنفيذ المتزامن يعني الحجب

ينفّذ JavaScript شيئًا واحدًا في كل مرة على خيط واحد. ما دامت هناك إطارات في المكدس، لا يُنفَّذ أي شيء آخر. وتحجب الشيفرة المتزامنة التنفيذ حتى تكتمل.

console.log('start');

function busy() {
  let sum = 0;
  for (let i = 0; i < 1000; i++) sum += i;
  return sum;
}

console.log(busy());
console.log('end');

تتدفق قيم الإرجاع إلى الأسفل

عند إزالة كل إطار، تعود قيمة الإرجاع الخاصة به إلى المستدعي المنتظر تحته في المكدس.

function square(n) {
  return n * n;
}
function sumOfSquares(a, b) {
  return square(a) + square(b);
}

console.log(sumOfSquares(3, 4));

تزيد الاستدعاءات التكرارية حجم المكدس

يضيف كل استدعاء تكراري إطارًا آخر. ويستمر المكدس في النمو حتى الوصول إلى حالة الأساس، ثم يُفرَّغ إطارًا بعد آخر.

function countdown(n) {
  if (n === 0) {
    console.log('liftoff');
    return;
  }
  console.log(n);
  countdown(n - 1);
}

countdown(3);

تجاوز سعة المكدس

للمكدس حجم محدود. ويستمر الاستدعاء التكراري من دون حالة أساس في دفع الإطارات حتى يطرح المحرك RangeError: Maximum call stack size exceeded.

function endless(n) {
  return endless(n + 1);
}

try {
  endless(1);
} catch (e) {
  console.log(e.name);
}

ترتيب التنفيذ متوقع

بما أن المكدس يعمل وفق LIFO بدقة وأن التنفيذ متزامن، فإن ترتيب السجلات المتزامنة يكون حتميًا دائمًا. ويمكنك تتبعه يدويًا.

function outer() {
  console.log(1);
  inner();
  console.log(3);
}
function inner() {
  console.log(2);
}
outer();
console.log(4);

متى تدخل العمليات غير المتزامنة؟

ينفّذ مكدس الاستدعاءات الشيفرة المتزامنة فقط. وتسلّم دوال مثل setTimeout العمل إلى البيئة، التي تضع دوال رد الاتصال لاحقًا في قوائم الانتظار. ولا تُنفَّذ دوال رد الاتصال هذه إلا عندما يكون المكدس فارغًا.

وهذه هي الصلة بحلقة الأحداث.

console.log('A');
setTimeout(() => console.log('B (later)'), 0);
console.log('C');

يجب إفراغ المكدس أولًا

حتى المؤقت ذي المهلة الصفرية ينتظر انتهاء كل الشيفرة المتزامنة. ولا يمكن تنفيذ دالة رد الاتصال ما دامت هناك إطارات في المكدس.

console.log('sync 1');
setTimeout(() => console.log('timeout'), 0);
console.log('sync 2');
console.log('sync 3');

لماذا يهم مكدس الاستدعاءات؟

يساعد فهم مكدس الاستدعاءات على تفسير سبب تجميد الحلقات المتزامنة الطويلة للصفحة، وسبب إمكانية تجاوز الاستدعاء التكراري لسعة المكدس، وسبب تنفيذ دوال رد الاتصال غير المتزامنة دائمًا في النهاية. وهو الأساس لكل ما يحدث في حلقة الأحداث.

function compute() {
  return [1, 2, 3].reduce((a, b) => a + b, 0);
}
console.log('before');
console.log(compute());
console.log('after');

اختبار سريع

ما مبدأ الترتيب الذي يتبعه مكدس الاستدعاءات؟

مراجعة: مكدس الاستدعاءات

لقد تعلمت أساس التنفيذ في المحرك:

  • يتتبع مكدس الاستدعاءات الدوال قيد التشغيل بترتيب LIFO.
  • إن JavaScript أحادي الخيط، وتحجب الشيفرة المتزامنة التنفيذ.
  • تزيد الاستدعاءات التكرارية حجم المكدس وقد تؤدي إلى تجاوزه.
  • تنتظر دوال رد الاتصال غير المتزامنة حتى يصبح المكدس فارغًا، وهو ما يقودنا إلى حلقة الأحداث.

الأسئلة الشائعة

هل درس «مكدس الاستدعاءات» مجاني؟

نعم — نص درس «مكدس الاستدعاءات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة JavaScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة JavaScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «مكدس الاستدعاءات»؟

شاهدوا كيفية تتبّع استدعاءات الدوال. تتمرن على JavaScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ JavaScript Academy؟

لا تُشترط خبرة سابقة. JavaScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «مكدس الاستدعاءات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس JavaScript Academy هذا؟

نعم. كل درس في JavaScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مكدس الاستدعاءات
  2. المهام الكبرى وقائمة المهام
  3. المهام الصغرى والوعود
  4. queueMicrotask وترتيب التنفيذ
← العودة إلى JavaScript Academy