Modulelessen (4/4)
Sluitingen en reikwijdte
Een sluiting is een functie die de variabelen "onthoudt" van het bereik waarin deze is gedefinieerd, zelfs nadat die reikwijdte is geëindigd. Het lijkt op magie, maar het is een direct gevolg van de reikwijdteregels.
Toepassingsgebied keten
Een functie kan variabelen lezen die buiten zichzelf zijn gedeclareerd, en loopt zo de keten van scopes op:
const moltiplicatore = 10;
function moltiplicaPer10(n) {
return n * moltiplicatore; // reads from the closure
}
moltiplicaPer10(3); // 30Functie fabriek
Het meest typische patroon: een functie die een andere functie retourneert, "aangepast" met de parameters die het heeft ontvangen.
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!'Elke aanroep van creaSaluto creëert een afzonderlijk bereik, met zijn eigen prefisso.
Teller met privéstatus
Het klassieke voorbeeld: een sluiting die een toonbank vasthoudt zonder deze aan de buitenkant bloot te stellen.
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 is privé: niemand buiten de afsluiting kan het lezen of wijzigen.
Probeer het
Implementeer een fabrieks `makeCounter()` die een functie retourneert: elke aanroep van de functie retourneert een progressief geheel getal beginnend bij 1. Verschillende tellers moeten onafhankelijk zijn.
Toon hint
Declareer n met let binnen makeCounter en retourneer vervolgens een functie die ++n doet.
Oplossing beschikbaar na 3 pogingen
Oefening beoordelen
Implementeer `makeAdderWith(base)` dat een functie retourneert: gegeven een getal n, retourneert het base + n. Elke opteller onthoudt zijn eigen basis.
Toon hint
retourneert een pijlfunctie die basis van de buitenste parameter gebruikt.
Oplossing beschikbaar na 3 pogingen