Warum benannte Funktionsausdrücke verwenden?
Wir haben zwei verschiedene Art und Weise tun Funktion Ausdruck in JavaScript:
Benannten Funktions-Ausdruck (NFE):
var boo = function boo () {
alert(1);
};
Anonymen Funktion der Ausdruck:
var boo = function () {
alert(1);
};
Und beide von Ihnen aufgerufen werden kann, mit boo();
. Ich kann wirklich nicht sehen, warum/Wann sollte ich verwenden Sie anonyme Funktionen und Wann sollte ich Benannte Funktions-Ausdrücke. Welchen Unterschied gibt es zwischen Ihnen?
InformationsquelleAutor der Frage Afshin Mehrabani | 2013-03-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Fall der anonymen Funktion der Ausdruck, die Funktion ist anonyme — buchstäblich, es hat keinen Namen. Die variable, die Sie zuweisen, um einen Namen hat, aber die Funktion nicht. (Update: Das war wahr, die durch ES5. Als der ES2015 [aka ES6], die oft eine Funktion erstellt mit einem anonymen Ausdruck bekommt einen wahren Namen gelesen,...)
Namen sind nützlich. Namen können gesehen werden in stack-traces, call stacks, Listen von breakpoints, etc.. Namen sind eine Gute Sache™.
Du musst davor hüten, von benannten Funktions-Ausdrücken, die in älteren Versionen des IE (IE8 und unten), weil der IE fälschlicherweise entstehen zwei völlig separate Funktion, Objekte in zwei völlig verschiedenen Zeiten (mehr in meinem blog-Artikel Double take). Wenn Sie brauchen, um Unterstützung für den IE8, ist es wahrscheinlich am besten stick mit anonymer Funktion Ausdrücken oder Funktion Erklärungenaber vermeiden, benannte Funktionsausdrücke.
Als der ES2015, obwohl, eine Menge von "anonym" - Funktion-Ausdrücke Funktionen erstellen, mit Namen, und dieser wurde vordatiert durch verschiedene moderne JavaScript-engines ganz smart über die Herleitung von Namen aus dem Kontext. In ES2015, dass Ihre anonymen Funktion der Ausdruck, die Ergebnisse in eine Funktion mit dem Namen
boo
. Dies ist die überall verstreut die Skillung eher, als dass Sie in einem Ort mit ein paar Regeln: - Suche nach vorkommen von "SetFunctionName", die derzeit gefunden in:lassen
undconst
- Deklaration die Semantik)Die kurze version ist im Grunde jederzeit eine anonyme Funktion, Ausdruck erscheint auf der rechten Seite so etwas wie eine Zuweisung oder Initialisierung, wie:
(oder könnte es sein
let
oderconst
eher alsvar
)oderoder
(die letzten beiden sind wirklich das gleiche)die resultierende Funktion einen Namen haben (
boo
in den Beispielen).Es ist ein wichtiger, und beabsichtigt, Ausnahme: Zuweisung an eine Eigenschaft eines bestehenden Objekts:
War dies aufgrund von Informationen, die Leck Bedenken, wenn die neue Funktion wurde durch den Prozess der Hinzugefügt wird; details in meiner Antwort auf eine andere Frage hier.
InformationsquelleAutor der Antwort T.J. Crowder
Benennung von Funktionen ist nützlich, wenn Sie benötigen, um auf sich selbst verweisen (z.B. für rekursive Aufrufe). In der Tat, wenn Sie auf der Durchreise sind, eine wörtliche Funktion-Ausdruck als argument direkt an eine andere Funktion, die Funktion Ausdruck nicht direkt auf sich selbst in ES5 strict-Modus, es sei denn, es benannt ist.
Betrachten Sie beispielsweise diesen code:
Wäre es unmöglich, zu schreiben, dieser code wirklich so sauber, wenn Sie die Funktion Ausdruck übergeben
setTimeout
waren anonym; wir brauchen würde, um es einer Variablen zuweisen, anstatt vor dersetTimeout
nennen. Auf diese Art und Weise einen benannten Funktions-Ausdruck, ist etwas kürzer und übersichtlicher.War es historisch möglich, code zu schreiben, wie dies auch mit einer anonymen Funktion der Ausdruck, durch die Nutzung
Argumente.angerufene
...... aber
arguments.callee
ist veraltet, und ist geradezu verboten, in ES5 strict-Modus. Daher MDN rät:(Hervorhebung von mir)
InformationsquelleAutor der Antwort Mark Amery
Falls eine Funktion angegeben wird, als eine Funktion, Ausdruck, es kann ein name vergeben werden.
Er wird nur innerhalb der Funktion (außer IE8-).
Dieser name soll für eine zuverlässige rekursive Funktion aufrufen, selbst wenn es geschrieben ist, in eine andere variable.
Beachten Sie, dass bei der Deklaration der Funktion dieser nicht geleistet werden kann. Diese "speziellen" interne name der Funktion angegeben wird nur in der Funktion Expression syntax.
Neben der NFE (Named Function Expression) Namen nicht überschrieben werden können:
InformationsquelleAutor der Antwort Roman
Benannten Funktions-Ausdrücken ist besser, wenn Sie wollen in der Lage sein, eine Referenz-Funktion in Frage, die zimmerreserviereung, ohne das Sie verlassen sich auf veraltete features wie
arguments.callee
.InformationsquelleAutor der Antwort Sudhir Bastakoti
Sollten Sie immer BENANNTE Funktionsausdrücke.
2.Anonyme Funktionen nicht hilft beim Debuggen, da Sie nicht sehen können, den Namen der Funktion, die Probleme verursacht.
3.Wenn Sie nicht den Namen einer Funktion, die später auf seine schwieriger zu verstehen, was Ihr tut.Geben Sie ihm einen Namen, macht es einfacher zu verstehen.
Hier, zum Beispiel, weil der name der bar ist innerhalb einer Funktion, Ausdruck, es ist nicht deklariert, die in dem äußeren Umfang.Mit benannten Funktions-Ausdrücken, den Namen der Funktion ein Ausdruck ist eingeschlossen innerhalb seiner eigenen Möglichkeiten.
InformationsquelleAutor der Antwort lux