דילוג לתוכן המרכזי
מודול 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 עם let בתוך makeCounter, ואז החזר פונקציה שעושה ++n.

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#js.m4.l4.e2
ניסיונות: 0טוען...

יישם `makeAdderWith(base)` שמחזיר פונקציה: בהינתן מספר n, הוא מחזיר base + n. כל מוסיף זוכר את הבסיס שלו.

טוען עורך...
הצג רמז

להחזיר פונקציית חץ שמשתמשת בבסיס מהפרמטר החיצוני.

הפתרון זמין לאחר 3 ניסיונות