Sie sind hier 479
Anonyme Funktionen, Geltungsbereiche und Closures
function cookieAlarm() {
alert("Zeit, die Kekse aus dem Ofen zu nehmen.");
};
setTimeout(cookieAlarm, 600000);
Wir müssen noch mal über Ihren
Wortreichtum reden
Es ist uns fast schon peinlich, aber wir müssen noch mal darüber reden. Mittler-
weile kennen Sie sich ziemlich gut mit Funktionen aus. Allerdings ist die Art, wie
sie anhand von Variablen herumgereicht werden, wortreicher als tatsächlich nötig
(man könnte auch sagen, sie sollte etwas ausdrucksstärker sein). Dazu ein Beispiel:
Und hier übernehmen wir die Funktion und reichen
sie als Argument an setTimeout weiter.
Obwohl der Code schon ganz gut aussieht, können wir ihn durch anonyme Funktionen weiter
zusammenfassen. Wie? Denken Sie an die Variable cookieAlarm im Aufruf von setTimeout.
Diese Variable referenziert eine Funktion, d. h., beim Aufruf von setTimeout wird eine Funk-
tionsreferenz übergeben. Hierbei ist die Verwendung einer Variablen zur Übergabe einer Funk-
tionsreferenz nur eine Möglichkeit. Wie Sie aus dem window.onload-Beispiel vor ein paar Seiten
wissen, gibt es aber auch die Möglichkeit, einen Funktionsausdruck zu verwenden. Wir wollen den
Code mithilfe eines Funktionsausdrucks neu schreiben:
Hier ist eine normal aussehende Funktion,
die eine Meldung ausgibt, sobald die Kekse
fertig sind.
Sieht aus, als seien die Kekse in 1
0
Minuten fertig – nur so nebenbei.
Falls Sie es nicht mehr wissen:
Das hier sind Millisekunden, d. h.
1
000 * 60 *
1
0 = 600.000.
setTimeout(function() { alert("Zeit, die Kekse aus dem Ofen zu nehmen.");}, 600000);
Anstelle einer Variablen betten wir hier
die Funktion direkt in den Aufruf von
setTimeout ein.
Dies ist das zweite
Argument nach dem
Funktionsausdruck.
Achten Sie hier sorgfältig auf die Syntax. Wir
schreiben zuerst den kompletten Funktionsausdruck,
der mit einer rechten geschweiften Klammer
abgeschlossen wird. Darauf folgt ein Komma und
dann das nächste Argument.
Wir geben den Namen der aufzurufenden Funktion,
hier setTimeout, gefolgt von runden Klammern,
an und übergeben als erstes Argument einen
Funktionsausdruck.
480 Kapitel 11
Anonyme Funktionsausdrücke formatieren
Wem wollen Sie hier etwas
vormachen? Dieser Code ist ein
ziemliches Durcheinander. Wer
soll diese lange Zeile lesen? Und
wie sieht das erst bei einer langen,
komplizierten Funktion aus?
Für kurze Codestücke ist ein Einzeiler vollkommen in
Ordnung. Darüber hinaus haben Sie recht, es wäre
ziemlich albern. Aber wie Sie wissen, darf man in
JavaScript an vielen Stellen Leerzeichen einfügen.
Mithilfe von Leerzeichen und Zeilenumbrüchen
können wir den Code problemlos lesbarer machen.
Hier ist unser neu formatierter setTimeout-Code
von der vorigen Seite.
setTimeout(function() {
alert("
Zeit, die Kekse aus dem Ofen zu nehmen.");
}, 600000);
Wir haben einfach ein paar zusätzliche
Leerzeichen und Zeilenumbrüche eingefügt.
Gut, dass Sie das angesprochen
haben, denn der Code ist jetzt
viel besser lesbar!
Sie sind hier 481
Anonyme Funktionen, Geltungsbereiche und Closures
Ich glaube, ich habe es verstanden.
Funktionsausdrücke werden zu
Funktionsreferenzen ausgewertet. Deshalb
kann man überall dort, wo eine Referenz
erwartet wird, auch einen Funktionsausdruck
benutzen, oder?
Es hat etwas gebraucht, aber Sie
haben es kapiert.
Dies ist einer der Hauptgründe dafür, dass
warum Funktionen Werte erster Klasse sind.
Wenn Ihr Code eine Funktionsreferenz erwar-
tet, können Sie an der gleichen Stelle immer
auch einen Funktionsausdruck verwenden, weil
sein Ergebnis ebenfalls eine Funktionsreferenz
ist. Wird eine Funktion als Argument erwartet,
können Sie ohne Weiteres auch einen Funkti-
onsausdruck benutzen (der auch hier vor der
Übergabe zu einer Funktionsreferenz ausgewer-
tet wird). Das funktioniert umgekehrt genauso.
Soll aus einer Funktion eine andere Funktion
zurückgegeben werden, kann hier ebenfalls ein
Funktionsausdruck benutzt werden.

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.