Salt la conținutul principal
Modulul 4 · Lecția 4 din 416/32 în curs~12 min
Lecții din modul (4/4)

Închideri și domeniul de aplicare

O închidere este o funcție care „îți amintește” de variabilele domeniului în care a fost definită, chiar și după ce s-a încheiat acel domeniu. Arată ca o magie, dar este o consecință directă a regulilor de aplicare.

Lanțul scopului

O funcție poate citi variabilele declarate în afara însăși, mergând în lanțul de domenii:

JS
const moltiplicatore = 10;

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

moltiplicaPer10(3); // 30

Fabrica de funcții

Cel mai tipic model: o funcție care returnează o altă funcție, „personalizată” cu parametrii pe care i-a primit.

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!'

Fiecare apel către creaSaluto creează un domeniu separat, cu propriul său prefisso.

Tejghea cu statul privat

Exemplul clasic: o închidere care ține un blat fără a-l expune la exterior.

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 este privat: nimeni din afara zonei de închidere nu îl poate citi sau modifica.

Încearcă

Exercițiu#js.m4.l4.e1
Încercări: 0Se încarcă…

Implementați o fabrică `makeCounter()` care returnează o funcție: fiecare apel al funcției returnează un număr întreg progresiv începând de la 1. Diferitele contoare trebuie să fie independente.

Se încarcă editorul...
Afișează indiciu

Declarați n cu let în makeCounter, apoi returnați o funcție care face ++n.

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#js.m4.l4.e2
Încercări: 0Se încarcă…

Implementați `makeAdderWith(base)` care returnează o funcție: dat un număr n, returnează bază + n. Fiecare sumator își amintește propria bază.

Se încarcă editorul...
Afișează indiciu

returnează o funcție săgeată care folosește baza din parametrul exterior.

Soluție disponibilă după 3 încercări