שיעורי מודול (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 עם let בתוך makeCounter, ואז החזר פונקציה שעושה ++n.
הפתרון זמין לאחר 3 ניסיונות
סקירת התרגיל
יישם `makeAdderWith(base)` שמחזיר פונקציה: בהינתן מספר n, הוא מחזיר base + n. כל מוסיף זוכר את הבסיס שלו.
הצג רמז
להחזיר פונקציית חץ שמשתמשת בבסיס מהפרמטר החיצוני.
הפתרון זמין לאחר 3 ניסיונות