Nuancen von Funktionsausdrücken in JavaScript
Der Name Function Expression (Funktionsausdruck) ist nicht ohne Grund gegeben. Er bedeutet tatsächlich genau das - dass solche Funktionen Teil eines Ausdrucks sind.
Wir können zum Beispiel einen String und eine anonyme Funktion addieren:
let str = 'str' + function() {return 3;};
console.log(str); // gibt 'strfunction() {return 3;}' aus
Warum sehen wir dieses seltsame Ergebnis und nicht die Zahl 3? Weil der zweite Summand nicht das Ergebnis des Funktionsaufrufs, sondern ihr Quellcode ist (da wir die Funktion nicht aufgerufen, sondern nur hingeschrieben haben).
Das bedeutet, der Name Funktionsausdruck bezeichnet, dass eine solche Funktion an einem Ausdruck teilnimmt.
Eine Zuweisung zu einer Variable ist ebenfalls ein Ausdruck:
let func = function() {
console.log('!');
};
Man kann die Funktion beispielsweise auch als Parameter an console.log übergeben, und sie gibt ihren Quellcode in der Konsole aus - das gilt auch als Ausdruck:
console.log(function() {return 3;});
Warum das wichtig ist: Der Unterschied zwischen Function Declaration und Function Expression liegt nämlich nicht darin, dass die erste Funktion mit einem Namen erstellt wird und die zweite ursprünglich keinen Namen hat. Das ist nicht der Fall.
Beispiel. Hier ist eine Funktion ohne Namen, die aber an keinem Ausdruck teilnimmt (das heißt, es werden keine Aktionen mit ihr durchgeführt, um es einfach auszudrücken):
/*
Diese Funktion wird eine Function Declaration sein,
aber mit einem Syntaxfehler:
*/
function() {
console.log('!');
}
Solcher Code wird überhaupt einen Fehler ausgeben! Warum: Da die Funktion an keinem Ausdruck teilnimmt, betrachtet der Browser sie als Function Declaration, findet aber ihren Namen nicht und gibt einen Fehler aus.
Damit der Fehler verschwindet, muss die Funktion Teil eines Ausdrucks werden. Schreiben wir zum Beispiel die Operation + vor sie:
+function() { // solcher Code ist korrekt
console.log('!');
};
Wie das funktioniert: Die Operation + allein macht nichts, das ist so, als würde man statt der Zahl 3 die Zahl +3 schreiben - erlaubt, aber ändert nichts.
Aber im Fall der Funktion ändert es sich. Jetzt ist unsere Funktion nicht mehr einfach nur hingeschrieben, sondern sie nimmt an einem Ausdruck teil. Daher wird es jetzt keinen Fehler geben. Das Ergebnis des Funktionsaufrufs wird auch nicht vorhanden sein, da wir sie nur geschrieben, aber nicht aufgerufen haben.
Statt + kann man alles Mögliche schreiben. Zum Beispiel:
-function() { // solcher Code ist korrekt
console.log('!');
};
!function() { // solcher Code ist korrekt
console.log('!');
};
Man kann die Funktion auch in runde Klammern setzen, in diesem Fall wird sie ebenfalls zu einem Funktionsausdruck:
(function() { // solcher Code ist korrekt
console.log('!');
});
Bestimmen Sie, ob die dargestellte Funktion eine Function Declaration oder ein Function Expression ist:
function func() {
console.log('!');
}
Bestimmen Sie, ob die dargestellte Funktion eine Function Declaration oder ein Function Expression ist:
let func = function() {
console.log('!');
}
Bestimmen Sie, ob die dargestellte Funktion eine Function Declaration oder ein Function Expression ist:
+function() {
console.log('!');
}
Bestimmen Sie, ob die dargestellte Funktion eine Function Declaration oder ein Function Expression ist:
!function func() {
console.log('!');
}
Bestimmen Sie, ob die dargestellte Funktion eine Function Declaration oder ein Function Expression ist:
-function func() {
console.log('!');
}
Bestimmen Sie, ob die dargestellte Funktion eine Function Declaration oder ein Function Expression ist:
1 + function func() {
console.log('!');
}
Bestimmen Sie, ob die dargestellte Funktion eine Function Declaration oder ein Function Expression ist:
(function func() {
console.log('!');
})
Bestimmen Sie, ob die dargestellte Funktion eine Function Declaration oder ein Function Expression ist:
console.log(
function() {
console.log('!');
}
);