Lektionen des Moduls (4/4)
Closures und Scope
Eine Closure (Funktionsabschluss) ist eine Funktion, die sich an die Variablen des Scopes (Gültigkeitsbereichs) „erinnert“, in dem sie definiert wurde, selbst nachdem dieser Scope beendet ist. Das klingt nach Magie, ist aber eine direkte Folge der Scope-Regeln.
Verkettete Scopes (Scope chain)
Eine Funktion kann Variablen lesen, die außerhalb von ihr deklariert wurden, indem sie die Scope-Kette nach oben wandert:
const moltiplicatore = 10;
function moltiplicaPer10(n) {
return n * moltiplicatore; // legge dalla closure
}
moltiplicaPer10(3); // 30Funktionsfabriken (Factory)
Das typischste Muster: Eine Funktion, die eine andere Funktion zurückgibt, die durch die empfangenen Parameter „personalisiert“ ist.
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!'Jeder Aufruf von creaSaluto erstellt einen separaten Scope mit seinem eigenen prefisso.
Zähler mit privatem Zustand
Das klassische Beispiel: Eine Closure, die einen Zähler verwaltet, ohne ihn nach außen hin offenzulegen.
function creaContatore() {
let n = 0;
return function () {
n++;
return n;
};
}
const c = creaContatore();
c(); // 1
c(); // 2
c(); // 3
const c2 = creaContatore();
c2(); // 1 ← stato isolato!n ist privat: Niemand außerhalb der Closure kann ihn lesen oder verändern.
Probier es aus
Implementiere eine Fabrik `makeCounter()`, die eine Funktion zurückgibt: Jeder Aufruf dieser Funktion soll eine fortlaufende Ganzzahl ab 1 zurückgeben. Verschiedene Zähler müssen voneinander unabhängig sein.
Hinweis anzeigen
Deklariere n mit let innerhalb von makeCounter, und gib dann eine Funktion zurück, die ++n ausführt.
Lösung nach 3 Versuchen verfügbar
Wiederholungsübung
Implementiere `makeAdderWith(base)`, das eine Funktion zurückgibt: Für eine gegebene Zahl n soll base + n zurückgegeben werden. Jeder Addierer erinnert sich an seine eigene Basis.
Hinweis anzeigen
Gib eine Pfeilfunktion zurück, die base aus dem äußeren Parameter verwendet.
Lösung nach 3 Versuchen verfügbar