Java Reference
In-Depth Information
return function() {
mFktion(text);
} ;
}
document.getElementById("b1").onclick = getText(
"Gebt mir einen Punkt, wo ich hintreten kann, " +
"\nund ich bewege die Erde.");
document.getElementById("b2").onclick = getText(
"Es gibt Dinge, die den meisten Menschen unglaublich erscheinen, " +
"\ndie nicht Mathematik studiert haben.");
</script>
</html>
In den letzten Zeilen des Listings sehen Sie zwei Funktionsaufrufe (!), die Eventhandlern
zugewiesen werden. Nun sollten Sie sich wegen der direkt vorangegangenen Ausführungen
zu Funktionsreferenzen bei JavaScript-Eventhandlern wundern. Denn hatte ich nicht be-
hauptet, dass man JavaScript-Eventhandlern nur einen Wert (eine Referenz) zuweist?! Und
hier steht dann doch ein Funktionsaufruf. Wie ist der (scheinbare) Widerspruch aufzulösen?
Ganz einfach. Dem Eventhandler wird der Rückgabewert (!) des Funktionsaufrufs zugewie-
sen. Und die hier aufgerufenen Funktionen müssen dazu eine bestimmte Struktur haben,
damit das sinnvoll funktioniert. Es müssen eben Callback-Funktionen sein, die eine Funkti-
onsreferenz als Rückgabewert liefern. Und dieser Funktionszeiger wird dem Eventhandler
zugewiesen. Betrachten wir die Deklaration der Callback-Funktion getText() , deren Rück-
gabewert den Eventhandlern zugewiesen wird:
Listing 5.57■ Nur die Callback-Funktion selbst
function getText(text){
return function(){
mFktion(text);
};
}
Was wird denn von der Funktion zurückgegeben? Die Referenz auf function(){
meineFktion(text); } . Dies ist eine anonyme, innere Funktion (ein Closure) und die lie-
fert einen Zeiger auf die Funktion - wie gewünscht und notwendig.
Aber damit haben wir bei einem lüchtigen Blick doch scheinbar exakt die Situation vorlie-
gen, als ob wir bei den JavaScript-Eventhandlern die anonymen Funktionen selbst hinge-
schrieben hätten. Sie können sich dann natürlich fragen, wozu man überhaupt diese Call-
back-Funktionen benutzt beziehungsweise warum man eine solche Technik unterstützt? Es
scheint ja so zu sein, dass man mit anonymen Funktionen vollkommen identische Lösungen
programmieren kann. Und in der Tat kann man sich in vielen Situationen für die eine oder
andere Variante entscheiden.
Aber in einer Situation müssen Sie auf Callback-Funktionen zurückgreifen, wenn Sie sich
das Leben nicht unnötig schwer machen wollen. Und zwar dann, wenn Sie einen Übergabe-
wert direkt an die Funktionsreferenz übergeben wollen. Denn wenn Sie bei dem Beispiel
genau hinsehen, erkennen Sie, dass der Parameterwert direkt an der Stelle angegeben wird,
an der die Zuweisung zu dem Eventhandler erfolgt. Bei einer anonymen Funktion wird der
Parameterwert im Inneren der anonymen Funktion erst notiert. Und damit haben wir doch
nicht identische Situationen vorliegen, sondern eklatant abweichende Konstellationen.
 
Search WWH ::




Custom Search