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:
const moltiplicatore = 10;
function moltiplicaPer10(n) {
return n * moltiplicatore; // reads from the closure
}
moltiplicaPer10(3); // 30Fabrica de funcții
Cel mai tipic model: o funcție care returnează o altă funcție, „personalizată” cu parametrii pe care i-a primit.
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.
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ă
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.
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
Implementați `makeAdderWith(base)` care returnează o funcție: dat un număr n, returnează bază + n. Fiecare sumator își amintește propria bază.
Afișează indiciu
returnează o funcție săgeată care folosește baza din parametrul exterior.
Soluție disponibilă după 3 încercări