W3docs

JavaScript Funktionsausdrücke

JavaScript bietet verschiedene Möglichkeiten, Funktionen zu definieren – zwei davon sind Funktionsdeklarationen und Funktionsausdrücke.

Einführung in Funktionsausdrücke in JavaScript

JavaScript bietet mehrere Möglichkeiten, Funktionen zu definieren. Zwei der grundlegendsten sind Funktionsdeklarationen und Funktionsausdrücke. Ein Funktionsausdruck erlaubt es, eine Funktion wie jeden anderen Wert zu behandeln: Sie können sie in einer Variablen speichern, an eine andere Funktion übergeben oder aus einer zurückgeben. Zu wissen, wie sich Ausdrücke von Deklarationen unterscheiden – insbesondere beim Hoisting – bewahrt Sie vor einer ganzen Klasse verwirrender Fehler.

Diese Seite behandelt die Syntax von Funktionsausdrücken, warum sie sich anders verhalten als Deklarationen, benannte Ausdrücke, die häufigsten praxisnahen Anwendungsfälle (Callbacks, IIFEs, Event-Handler, asynchroner Code) und wie all das mit modernen Pfeilfunktionen zusammenhängt.

Funktionsausdrücke: Syntax und Verwendung

Was ist ein Funktionsausdruck?

Ein Funktionsausdruck definiert eine Funktion als Teil eines größeren Ausdrucks – typischerweise auf der rechten Seite einer Zuweisung. Die Funktion selbst ist nur ein Wert, und die Variable, der Sie sie zuweisen, wird zum Weg, sie aufzurufen. Hier ist die einfachste Form:

javascript— editable

Vergleichen Sie dies mit einer Funktionsdeklaration, die mit dem Schlüsselwort function als eigenständige Anweisung beginnt:

javascript— editable

Beide erzeugen ein aufrufbares greet, aber sie werden von der Engine zu unterschiedlichen Zeiten verarbeitet – genau darum geht es im nächsten Abschnitt.

Hoisting: der entscheidende Unterschied

Funktionsdeklarationen werden gehoisted: Die Engine liest sie während der Kompilierungsphase, sodass die Funktion existiert, bevor die Zeile erreicht wird, in der sie steht. Sie können sie früher in der Datei aufrufen. Funktionsausdrücke hingegen nicht – der Funktionswert wird erst zugewiesen, wenn die Ausführung diese Zeile erreicht, sodass ein zu früher Aufruf fehlschlägt:

javascript— editable
Info

Hinweis: Bei var wird der Name greet gehoisted, sein Wert ist jedoch undefined, bis die Zuweisung ausgeführt wird. Ein zu früher Aufruf löst daher einen TypeError aus ("greet is not a function"). Bei let oder const befindet sich der Name in der Temporal Dead Zone, und Sie erhalten stattdessen einen ReferenceError. In jedem Fall gilt die gleiche Regel: Definieren Sie einen Funktionsausdruck, bevor Sie ihn verwenden.

Merkmale von Funktionsausdrücken

  • Anonyme Funktionen: Funktionsausdrücke sind oft anonym – die Funktion hat keinen eigenen Namen und wird über die Variable referenziert.
  • In Variablen gespeichert: Die Funktion ist ein Wert und lebt daher in einer Variablen (oder einem Array-Element, einer Objekteigenschaft usw.).
  • Erstklassige Bürger: In JavaScript sind Funktionen erstklassige Werte – sie können als Argumente übergeben, von anderen Funktionen zurückgegeben und Variablen zugewiesen werden.
  • Benannte Funktionsausdrücke: Ein Ausdruck kann einen eigenen Namen tragen (z. B. let fn = function myFunc() {}). Der Name ist nur innerhalb der Funktion sichtbar, was Stack-Traces verbessert und es der Funktion ermöglicht, sich selbst aufzurufen.
  • Pfeilfunktionen: Moderner Code verwendet häufig Pfeilfunktionen (() => {}) als kürzere Form des Ausdrucks, obwohl sie this anders behandeln.

Benannte Funktionsausdrücke

Einem Ausdruck einen internen Namen zu geben, ermöglicht es der Funktion, sich zuverlässig auf sich selbst zu beziehen – praktisch für Rekursion – selbst wenn die äußere Variable später neu zugewiesen wird:

javascript— editable

Praktische Anwendungen von Funktionsausdrücken

Callback-Funktionen

Die häufigste Verwendung eines Funktionsausdrucks ist als Callback – eine Funktion, die an eine andere Funktion übergeben und später ausgeführt wird, nachdem eine Operation abgeschlossen ist. Die Funktion direkt als Ausdruck zu übergeben, hält die Logik genau dort, wo sie verwendet wird:

javascript— editable

IIFE (Immediately Invoked Function Expression)

Ein IIFE ist ein Funktionsausdruck, der in dem Moment ausgeführt wird, in dem er definiert wird. Die umschließenden Klammern machen die Funktion zu einem Ausdruck, und das abschließende () ruft sie sofort auf. Dies war die klassische Methode, einen privaten Gültigkeitsbereich zu erstellen und zu verhindern, dass Variablen in den globalen Gültigkeitsbereich gelangen:

javascript— editable
Info

Hinweis: Heute decken blockbezogenes let/const und ES-Module das meiste ab, wofür IIFEs verwendet wurden. In neuem Code begegnen Sie ihnen daher seltener – in älteren Bibliotheken und gebündelten Skripten sind sie jedoch nach wie vor verbreitet.

Funktionsausdrücke vs. Funktionsdeklarationen

FunktionsdeklarationFunktionsausdruck
Syntaxfunction f() {} als Anweisunglet f = function () {} innerhalb eines Ausdrucks
HoistingVollständig gehoisted – aufrufbar vor der eigenen ZeileNicht aufrufbar, bevor die Zuweisung ausgeführt wird
BenennungImmer benanntOft anonym (kann benannt werden)
Geeignet fürEigenständige Hilfsfunktionen, die in der gesamten Datei verwendet werdenCallbacks, IIFEs, bedingte Definitionen

Eine praktische Faustregel: Greifen Sie auf eine Deklaration zurück, wenn Sie eine eigenständige, wiederverwendbare Funktion benötigen, und auf einen Ausdruck, wenn die Funktion ein Wert ist, den Sie übergeben oder bedingt definieren möchten.

javascript— editable

Erweiterte Beispiele und Anwendungsfälle

Event-Handling

Im Browser sind Funktionsausdrücke die natürliche Methode, Event-Handler zu registrieren, da Sie die Funktion direkt an addEventListener übergeben:

document.getElementById('myButton').addEventListener('click', function () {
  console.log('Button clicked!');
});

Asynchrone Programmierung

Mit Promises und async/await bieten Funktionsausdrücke eine prägnante Möglichkeit, Codeeinheiten weiterzugeben. Hier verarbeitet ein Funktionsausdruck jeden aufgelösten Wert:

javascript— editable

Fazit

Die Beherrschung von Funktionsausdrücken in JavaScript ist der Schlüssel zum Schreiben von effizientem und wartbarem Code. Ihre Flexibilität, kombiniert mit der Stärke der funktionalen Programmiermöglichkeiten von JavaScript, macht sie zu einem unverzichtbaren Werkzeug im Arsenal eines Entwicklers.

Denken Sie daran: Die Wahl zwischen einem Funktionsausdruck und einer Funktionsdeklaration hängt von den spezifischen Anforderungen Ihres Codes und dem Kontext ab, in dem Sie arbeiten. Üben Sie weiter und erkunden Sie diese Konzepte, um Ihr Verständnis und Ihre Kenntnisse in JavaScript zu vertiefen.

Übungen

Übung
Was sind die Merkmale von Funktionsausdrücken in JavaScript?
Was sind die Merkmale von Funktionsausdrücken in JavaScript?
Was this page helpful?