Sie sind hier 499
Anonyme Funktionen, Geltungsbereiche und Closures
Probefahrt für den magischen Zähler
function makeCounter() {
var count = 0;
function counter() {
count = count + 1;
return count;
}
return counter;
}
var doCount = makeCounter();
console.log(doCount());
console.log(doCount());
console.log(doCount());
Ein Blick hinter die Kulissen
Damit Sie den Zähler ausprobieren können, haben wir etwas Testcode eingebaut. Machen Sie mal einen Versuch!
JavaScript-Konsole
1
2
3
Unser Zähler funktioniert
… wir erhalten konsistente
Ergebnisse.
Gehen wir den Code Schritt für Schritt durch, um zu
sehen, was er tut.
function makeCounter() {
var count = 0;
function counter() {
count = count + 1;
return count;
}
return counter;
}
var doCount = makeCounter();
console.log(doCount());
console.log(doCount());
console.log(doCount());
var count = 0;
function counter() {
count = count + 1;
return count;
}
Durch den Aufruf von
makeCounter erhalten
wir eine Closure zurück:
eine Funktion mit
eigener Umgebung.
1
Hier rufen wir makeCounter auf, wodurch eine
Zählerfunktion (»counter«) zurückgegeben wird.
Sie besitzt eine Umgebung, die die freie Variable
count enthält, d. h., sie erzeugt eine Closure. Die
von makeCounter zurückgegebene Funktion wird in
doCount gespeichert.
2
Wir nennen die Funktion doCount. Sie führt den
Körper der counter-Funktion aus.
3
Wenn wir der Variablen count begegnen, lesen wir
ihren Wert aus der Umgebung aus, inkrementieren
den Wert um eins und speichern den neuen Wert in
die Umgebung zurück. Danach wird der neue Wert
an den Aufrufer von doCount zurückgegeben.
4
Bei jedem Aufruf von doCount werden die Schritte 2
und 3 wiederholt.
Beim Aufruf von doCount (einer Referenz auf counter)
brauchen wir den Wert von count. Also benutzen wir die count-
Variable aus der Umgebung der Closure. Die Außenwelt (der globale
Geltungsbereich) bekommt die Variable count nicht zu sehen. Dennoch
können wir sie bei jedem Aufruf von doCount benutzen. Das heißt,
doCount ist nur über einen Aufruf von doCount zugänglich..
1
2
3
4
Dies
ist eine
Closure.
500 Kapitel 11
Übung zu Closures
Jetzt sind Sie dran. Versuchen Sie, die folgenden Closures zu erstellen. Es ist uns völlig klar,
dass das am Anfang nicht leicht sein wird. Sehen Sie bei Bedarf also ruhig in den Antworten
nach. Hauptsache, Sie arbeiten diese Beispiele durch und verstehen tatsächlich, was hier
passiert.
function makePassword(password) {
return __________________________ {
return (passwordGuess === password);
};
}
Erste Aufgabe für 10 Punkte: Die Funktion makePassword übernimmt ein Passwort als Argument
und gibt eine Funktion zurück. Diese übernimmt eine Passworteingabe und gibt true zurück,
wenn das Argument mit dem an makePassword übergebenen String übereinstimmt (manchmal
müssen Sie die Closure-Beschreibungen mehrmals lesen, um sie zu verstehen):
function multN(n) {
return __________________________ {
return _____________;
};
}
Nächste Aufgabe für 20 Punkte: Die Funktion multN übernimmt eine Zahl (wir nennen sie n)
und gibt eine Funktion zurück. Diese übernimmt eine Zahl, multipliziert sie mit n und gibt
das Ergebnis zurück.
Letzte Aufgabe für 30 Punkte: Dies ist eine Abwandlung des gerade erstellten Zählers.
makeCounter übernimmt keine Argumente, definiert aber eine count-Variable. Dann
erstellt sie ein Objekt, das eine Methode namens increment enthält. Diese inkrementiert
die Variable count und gibt sie zurück.
Übung

Get JavaScript-Programmierung von Kopf bis Fuß now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.