502 Kapitel 11
Die Closure enthält die Umgebung
function setTimer(doneMessage, n) {
setTimeout(function() {
alert(doneMessage);
}, n);
doneMessage = "AUTSCH!";
}
setTimer("Die Kekse sind fertig!", 1000);
Die Closure enthält keine Kopie, sondern die tatsächliche Umgebung
var doneMessage =
"Die Kekse sind
fertig!"
function() {
alert(doneMessage);
}
var doneMessage =
"AUTSCH!"
function() {
alert(doneMessage);
}
setTimeout(function() {
alert(doneMessage);
}, n);
1
Beim Aufruf von setTimeout und der Übergabe des
Funktionsausdrucks wird eine Closure erzeugt, die
die Funktion und eine Referenz auf die Umgebung
enthält.
2
Wenn wir dann außerhalb der Closure den Wert
von doneMessage in »AUTSCH!« ändern, geschieht
diese Änderung in der gleichen Umgebung, die
auch von der Closure verwendet wird.
3
1000 Millisekunden später wird die Funktion in der
Closure aufgerufen. Diese Funktion referenziert die
Variable doneMessage, die in der Umgebung den
Wert »AUTSCH!« besitzt. Dementsprechend sehen wir
»AUTSCH!« in der Warnmeldung.
doneMessage = "AUTSCH!";
function() { alert(doneMessage); }
Beim Aufruf der Funktion wird der Wert von
doneMessage verwendet, der sich in der Umgebung
befindet. Dies entspricht dem neuen Wert, den wir
zuvor in setTimer gesetzt haben.
Jetzt ändern wir den Wert
von doneMessage nach dem
Aufruf von setTimeout.
Hier wird die Closure angelegt.
Viele Leute glauben, wenn sie sich erstmals mit Closures beschäftigen, die Umgebung in der Closure enthielte
eine Kopie aller Variablen und Werte. Das stimmt aber nicht. In Wirklichkeit bezieht sich die Umgebung
auf die tatsächlich in Ihrem Code verwendeten Variablen. Wird ein Wert vom Code außerhalb der Closure
verändert, ist dieser neue Wert auch bei der Auswertung Ihrer Closure-Funktion sichtbar.
Wir wollen unser Beispiel ein wenig verändern, um zu sehen, was das heißt.

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.