دروس الوحدة (4/4)
الإغلاق والنطاق
الإغلاق هو دالة "تتذكر" متغيرات النطاق الذي تم تعريفها فيه، حتى بعد انتهاء هذا النطاق. يبدو الأمر كالسحر ولكنه نتيجة مباشرة لقواعد النطاق.
سلسلة النطاق
يمكن للدالة قراءة المتغيرات المعلنة خارج نفسها، من خلال سلسلة النطاقات:
const moltiplicatore = 10;
function moltiplicaPer10(n) {
return n * moltiplicatore; // reads from the closure
}
moltiplicaPer10(3); // 30مصنع الوظائف
النمط الأكثر شيوعًا: دالة ترجع وظيفة أخرى، "مخصصة" باستخدام التابع المعلمات التي تلقاها
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 الخاص به.
مكافحة مع الدولة الخاصة
المثال الكلاسيكي: إغلاق يحافظ على العداد دون تعريضه للخارج.
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 خاص: لا يمكن لأي شخص خارج الإغلاق قراءته أو تعديله.
جربه
قم بتنفيذ مصنع `makeCounter()` الذي يُرجع دالة: يُرجع كل استدعاء للدالة عددًا صحيحًا تدريجيًا يبدأ من 1. يجب أن تكون العدادات المختلفة مستقلة.
إظهار التلميح
قم بتعريف n باستخدام makeCounter، ثم قم بإرجاع دالة تقوم بـ ++n.
الحل متاح بعد 3 من المحاولات
تمرين المراجعة
قم بتنفيذ `makeAdderWith(base)` الذي يُرجع دالة: بالنظر إلى الرقم n، فإنه يُرجع base + n. يتذكر كل أفعى قاعدته الخاصة.
إظهار التلميح
إرجاع دالة سهم تستخدم القاعدة من المعلمة الخارجية.
الحل متاح بعد 3 من المحاولات