الانتقال إلى المحتوى الرئيسي
الوحدة 4 · الدرس 4 من 416/32 في الدورة~12 min
دروس الوحدة (4/4)

الإغلاق والنطاق

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

سلسلة النطاق

يمكن للدالة قراءة المتغيرات المعلنة خارج نفسها، من خلال سلسلة النطاقات:

JS
const moltiplicatore = 10;

function moltiplicaPer10(n) {
  return n * moltiplicatore; // reads from the closure
}

moltiplicaPer10(3); // 30

مصنع الوظائف

النمط الأكثر شيوعًا: دالة ترجع وظيفة أخرى، "مخصصة" باستخدام التابع المعلمات التي تلقاها

JS
function creaSaluto(prefisso) {
  return function (nome) {
    return `${prefisso}, ${nome}!`;
  };
}

const ciao = creaSaluto('Ciao');
const buongiorno = creaSaluto('Buongiorno');

ciao('Anna'); // 'Ciao, Anna!'
buongiorno('Marco'); // 'Buongiorno, Marco!'

كل استدعاء لـ creaSaluto ينشئ نطاق منفصل، مع prefisso الخاص به.

مكافحة مع الدولة الخاصة

المثال الكلاسيكي: إغلاق يحافظ على العداد دون تعريضه للخارج.

JS
function creaContatore() {
  let n = 0;
  return function () {
    n++;
    return n;
  };
}

const c = creaContatore();
c(); // 1
c(); // 2
c(); // 3

const c2 = creaContatore();
c2(); // 1  ← isolated state!

n خاص: لا يمكن لأي شخص خارج الإغلاق قراءته أو تعديله.

جربه

تمرين#js.m4.l4.e1
المحاولات: 0جارٍ التحميل…

قم بتنفيذ مصنع `makeCounter()` الذي يُرجع دالة: يُرجع كل استدعاء للدالة عددًا صحيحًا تدريجيًا يبدأ من 1. يجب أن تكون العدادات المختلفة مستقلة.

جارٍ تحميل المحرر…
إظهار التلميح

قم بتعريف n باستخدام makeCounter، ثم قم بإرجاع دالة تقوم بـ ++n.

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#js.m4.l4.e2
المحاولات: 0جارٍ التحميل…

قم بتنفيذ `makeAdderWith(base)` الذي يُرجع دالة: بالنظر إلى الرقم n، فإنه يُرجع base + n. يتذكر كل أفعى قاعدته الخاصة.

جارٍ تحميل المحرر…
إظهار التلميح

إرجاع دالة سهم تستخدم القاعدة من المعلمة الخارجية.

الحل متاح بعد 3 من المحاولات