484 Kapitel 11
Wann werden Funktionen definiert?
Was ist da gerade passiert? Warum war fly nicht definiert?
var migrating = true;
if (migrating) {
quack(4);
fly(4);
}
var fly = function(num) {
for (var i = 0; i < num; i++) {
console.log("Ich fliege!");
}
};
function quack(num) {
for (var i = 0; i < num; i++) {
console.log("Quak!");
}
}
Wir wissen, dass die fly-Funktion bei ihrem Aufruf noch nicht definiert
ist – aber warum? Schließlich hat quack doch auch problemlos funktioniert.
Vermutlich haben Sie es schon erraten. Im Gegensatz zu quack, das beim
ersten Codedurchlauf definiert wird, passiert die Definition von fly erst bei
der normalen Codeauswertung von oben nach unten. Sehen Sie sich das noch
einmal an:
Wenn wir versuchen, diesen Code auszuwerten, um
quack aufzurufen, funktioniert alles wie erwartet,
weil quack beim ersten Codedurchlauf definiert wurde.
Aber wenn wir versuchen, den
Aufruf der fly-Funktion
auszuführen, bekommen wir einen
Fehler, da wir fly noch nicht
definiert haben …
JavaScript-Konsole
Quak!
Quak!
Quak!
Quak!
TypeError: undefined is not a function
Was passiert beim Aufruf einer
undefinierten Funktion?
Was hat das alles zu bedeuten? Zunächst einmal heißt es, dass Sie Funktionsdeklarationen an belie-
biger Stelle in Ihrem Code platzieren können – am Anfang, am Ende, in der Mitte – und sie aufru-
fen können, wo Sie wollen. Funktionsdeklarationen erzeugen Funktionen, die an beliebiger Stelle
in Ihrem Code definiert sein können (das wird auch als hoisting, also »hochziehen«, bezeichnet).
Funktionsausdrücke sind da offensichtlich anders, da sie erst bei ihrer Auswertung definiert
werden. Selbst wenn Sie den Funktionsausdruck, wie bei fly, einer globalen Variablen zuwei-
sen, können Sie die Variable erst benutzen, um die Funktion aufzurufen, nachdem die Funktion
definiert wurde.
In diesem Beispiel haben beide Funktionen einen globalen Geltungsbereich, d. h., sie sind nach ihrer
Definition im gesamten Code sichtbar. Wir müssen aber auch die verschachtelten Funktionen be-
achten (also Funktionen, die innerhalb anderer Funktionen definiert wurden), da sich das auf den
Geltungsbereich dieser Funktionen auswirkt. Das wollen wir uns einmal ansehen.
… weil fly nicht
definiert wird, bis diese
Anweisung ausgewertet
wird, was erst nach dem
Aufruf von fly passiert.
Stattdessen sehen Sie
vermutlich einen Fehler
wie diesen (abhängig vom
verwendeten Browser):
TypeError: Property ‘fly’
of object [object Object]
is not a function.
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.