HOWTO · JavaScript
Verschachtelte Funktionen in JavaScript
Dieses Tutorial zeigt verschachtelte Funktionen in JavaScript.
Auf dieser Seite
Eine verschachtelte Funktion ist eine Funktion, die innerhalb einer anderen Funktion definiert wird. Die äußere Funktion bestimmt, wo die innere Funktion verfügbar ist. Die innere Funktion kann Variablen aus dem Gültigkeitsbereich lesen, in dem sie erstellt wurde. Dieser Leitfaden zeigt, wie Sie eine verschachtelte Funktion definieren und aufrufen, warum ihr Zugriff auf äußere Variablen nützlich sein kann und wie der Code übersichtlich bleibt.
Was sind verschachtelte Funktionen?
In JavaScript kann eine innere Funktion auf Parameter und lokale Variablen ihrer äußeren Funktion zugreifen. Bleibt die innere Funktion nach der Rückkehr der äußeren Funktion erreichbar, behält sie den Zugriff auf die Variablen, auf die sie verweist. Diese Verbindung aus einer Funktion und ihrem erhaltenen lexikalischen Zugriff wird als Closure bezeichnet.
Führen Sie dieses Beispiel aus:
function makeAdder(amount) {
return function add(value) {
return amount + value;
};
}
const addFive = makeAdder(5);
console.log(addFive(10));
15
Das bereitgestellte Laufzeitergebnis lautet 15. makeAdder(5) gibt die innere Funktion zurück, die anschließend mit 10 aufgerufen wird. Dabei liest die innere Funktion amount aus dem lexikalischen Gültigkeitsbereich des äußeren Funktionsaufrufs. Eine innere Funktion zurückzugeben, ist ein verbreitetes Closure-Muster. Das ist nicht automatisch Currying: Beim Currying wird eine Funktion, die mehrere Argumente annimmt, gezielt in eine Folge von Funktionen umgewandelt, die jeweils ein Argument annehmen.
Vorteile verschachtelter Funktionen
Durch Verschachtelung bleibt eine Hilfsfunktion nahe bei dem Code, der sie verwendet, und ihr Name wird nicht zum umgebenden Gültigkeitsbereich hinzugefügt. Eine zurückgegebene innere Funktion kann außerdem zwischen Aufrufen einen privaten Zustand bewahren. Eine Zählerfabrik kann beispielsweise eine lokale Variable count anlegen und eine Funktion zurückgeben, die diesen Wert aktualisiert. Jeder Aufruf der Fabrik erzeugt eine eigene Bindung, sodass getrennte Zähler ihren Zustand unabhängig voneinander verwalten können. Closures ermöglichen dieses Verhalten, garantieren aber keine schnellere Ausführung.
Eine innere Funktion kann auf äußere Variablen zugreifen. Das macht jedoch nicht jeden Callback zu einer verschachtelten Funktion. Ein anderswo definierter Callback, der an eine Funktion übergeben wird, ist ein Callback für eine Funktion höherer Ordnung. Verschachtelt ist er nur, wenn seine Definition innerhalb einer anderen Funktion steht.
Wann sollten Sie verschachtelte Funktionen verwenden?
Verwenden Sie eine verschachtelte Funktion, wenn sie Werte oder den Gültigkeitsbereich ihrer äußeren Funktion benötigt, wenn eine Hilfsfunktion nur dort sinnvoll ist oder wenn Sie eine mit einem Wert konfigurierte Funktion erstellen möchten, etwa mit einem Multiplikator. Wenn Sie diese konfigurierte Funktion zurückgeben, können Aufrufer die Einstellung wiederverwenden, ohne sie bei jedem Aufruf erneut zu übergeben.
Benötigt die Hilfsfunktion weder Variablen noch den Gültigkeitsbereich der äußeren Funktion, lässt sie sich auf einer höheren Ebene möglicherweise leichter wiederverwenden und testen. Verschachteln Sie Funktionen wegen einer klaren Beziehung oder eines beizubehaltenden Zustands, nicht allein deshalb, weil eine Funktion innerhalb einer anderen stehen kann.
Bewährte Vorgehensweisen für verschachtelte Funktionen
Geben Sie jeder Funktion eine klar umrissene Aufgabe und wählen Sie Namen, die den Zusammenhang zwischen der Einrichtung in der äußeren Funktion und der Aktion in der inneren Funktion verdeutlichen. Vermeiden Sie Verschachtelungsebenen, die den Kontrollfluss schwer nachvollziehbar machen. Lösen Sie eine Hilfsfunktion heraus, wenn sie eigenständig sinnvoll ist oder die umgebende Funktion schwer zu überblicken wird.
Eine Closure behält den Zugriff auf ihre lexikalische Umgebung, solange sie erreichbar bleibt. Das ist normales Verhalten und kein Grund, Closures grundsätzlich zu vermeiden. In langlebigem Code sollten Sie eine Closure nicht länger als nötig erreichbar halten, wenn dadurch auch große Objekte erreichbar bleiben.
Fazit
Eine verschachtelte Funktion wird innerhalb einer anderen Funktion definiert und kann über den lexikalischen Gültigkeitsbereich auf deren Variablen zugreifen. Wird sie zurückgegeben, kann sie diesen Zugriff als Closure bewahren und so privaten Zustand sowie wiederverwendbare Konfiguration ermöglichen. Verwenden Sie dieses Muster, wenn der Zusammenhang den Code verständlicher macht, und reduzieren Sie die Verschachtelung, wenn sie die Abläufe verschleiert.
Häufig gestellte Fragen (FAQ)
- Was sind verschachtelte Funktionen in JavaScript? Eine verschachtelte Funktion wird innerhalb einer anderen Funktion definiert und kann auf Variablen in deren äußerem lexikalischen Gültigkeitsbereich zugreifen.
- Warum sollte man verschachtelte Funktionen verwenden? Sie können Hilfsfunktionen lokal halten, Zustand in einer Closure bewahren oder Funktionen erstellen, die mit einem äußeren Wert konfiguriert sind. Die Ausführung wird dadurch nicht grundsätzlich schneller.
- Können verschachtelte Funktionen auf Variablen der äußeren Funktion zugreifen? Ja. Eine innere Funktion kann Variablen in ihrem lexikalischen Gültigkeitsbereich lesen. Bleibt sie erreichbar, gilt das auch, nachdem die äußere Funktion zurückgekehrt ist.
- Was ist ein Nachteil verschachtelter Funktionen? Zu viele Verschachtelungsebenen können Code schwerer lesbar und wartbar machen.
- Wie lassen sich verschachtelte Funktionen sinnvoll einsetzen? Halten Sie sie auf eine Aufgabe konzentriert, wählen Sie aussagekräftige Namen und definieren Sie eine Hilfsfunktion auf einer höheren Ebene, wenn sie den umgebenden Gültigkeitsbereich nicht benötigt.