Direkt zum Hauptinhalt springen
eLearner.app
Modul 4 · Lektion 4 von 416/32 im Kurs~12 min
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:

JS
const moltiplicatore = 10;

function moltiplicaPer10(n) {
  return n * moltiplicatore; // legge dalla closure
}

moltiplicaPer10(3); // 30

Funktionsfabriken (Factory)

Das typischste Muster: Eine Funktion, die eine andere Funktion zurückgibt, die durch die empfangenen Parameter „personalisiert“ ist.

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

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.

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  ← stato isolato!

n ist privat: Niemand außerhalb der Closure kann ihn lesen oder verändern.

Probier es aus

Übung#js.m4.l4.e1
Versuche: 0Wird geladen…

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.

Editor wird geladen…
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

Übung#js.m4.l4.e2
Versuche: 0Wird geladen…

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.

Editor wird geladen…
Hinweis anzeigen

Gib eine Pfeilfunktion zurück, die base aus dem äußeren Parameter verwendet.

Lösung nach 3 Versuchen verfügbar