molily: Wert-Übergabe bei window.setTimeout()

Beitrag lesen

Hallo,

Dann geht das so nicht, in dem Fall kannst du entweder mit einer anonymen Funktion arbeiten

Zur Erläuterung: Vielleicht sollte man dazu sagen, dass nicht der springende Punkt ist, dass die Funktion »anonym« ist. Man könnte ihr ruhig einen Namen geben, das ist nicht erheblich.

Das Stichwort lautet Closure. In der Funktion, die innerhalb einer anderen Funktion notiert wird, hat man Zugriff auf die lokalen Variablen der äußeren Funktion - auch wenn sie später außerhalb dieses Geltungsbereiches ausgeführt wird, wie es bei setTimeout der Fall ist.

function äußere_funktion (parameter) {  
   var lokale_variable = parameter;  
   function innere_funktion () {  
      alert(lokale_variable);  
   }  
   window.setTimeout(innere_funktion, 1000);  
}  
äußere_funktion("Closure");

Das illustriert den Closure-Effekt.

Jetzt gibt es noch andere Arten, eine Funktion zu notieren als die übliche, oben gezeigte. Es gibt sogenannte Function-Expressions, die man an jeder beliebigen Stelle verwenden kann, wo Ausdrücke erlaubt sind. Sie geben ein Function-Objekt zurück (Funktionen sind in JavaScript selbst Objekte), dass man dann in einer Variable speichern kann oder einer Funktion als Parameter übergeben kann (wie im setTimeout-Beispiel):

alert(function () { alert("Function-Expression"); })  
var func = function () { alert("Function-Expression"); };  
window.setTimeout(function () { alert("Function-Expression"); }, 1000);  
(function (param) { alert(param); })("Function-Expression");

Diese Funktionen sind »anonym«, weil sie nicht notwendigerweise unter einem Namen abgespeichert sind, sondern erst einmal nur solange existieren, bis der Ausdruck abgearbeitet ist.

Wie alle Funktionen, die in anderen Funktionen notiert werden, wirken auch Function-Expressions als Closures.

function äußere_funktion () {  
   var lokale_variable = "Closure";  
   // Speichere das zurückgegebene Funktionsobjekt im globalen Objekt innere_funktion:  
   innere_funktion = function () { alert(lokale_variable); };  
}  
äußere_funktion();  
innere_funktion();

Obwohl die äußere_funktion schon längst nicht mehr ausgeführt wird, wurden die lokalen Variablen, die beim Funktionsaufruf angelegt wurden, noch nicht aus dem Speicher gelöscht, denn innere_funktion (die in dem Fall global verfügbar gemacht wird) hat diese »eingeschlossen«.

Mathias