Position der Klammern für die automatische Ausführung anonymer JavaScript-Funktionen?
Ich war vor kurzem beim Vergleich der aktuellen version von json2.js mit der version hatte ich in meinem Projekt und bemerkte einen Unterschied, wie die Funktion Ausdruck erstellt wurde, und selbst ausgeführt.
Den code verwendet, um wickeln Sie eine anonyme Funktion in der Klammer und führen Sie Sie,
(function () {
//code here
})();
aber jetzt packt es die auto-Funktion ausgeführt, in Klammern.
(function () {
//code here
}());
Gibt es ein Kommentar von CMS in der akzeptierten Antwort von Erklären Sie JavaScript gekapselt anonyme Funktion syntaxdass "beide: (function(){})();
und (function(){}());
gültig sind."
Ich Frage mich, was der Unterschied ist? Hat der ehemalige take-up-Speicher verlassen, um eine Globale, anonyme Funktion? Wo soll die Klammer sein?
InformationsquelleAutor der Frage Kevin Hakanson | 2010-08-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie sind praktisch die gleichen.
Die ersten Packungen Klammern um eine Funktion zu machen die einen gültigen Ausdruck und ruft ihn. Das Ergebnis des Ausdrucks ist undefiniert.
Die zweite führt die Funktion und die Klammern um den automatischen Aufruf machen es zu einem gültigen Ausdruck. Es wertet auch zu undefiniert.
Ich glaube nicht, dass es einen "richtigen" Weg, es zu tun, da das Ergebnis des Ausdrucks ist die gleiche.
InformationsquelleAutor der Antwort meder omuraliev
In diesem Fall ist es egal. Werden Sie den Aufruf ein Ausdruck, der aufgelöst wird, zu einer Funktion die erste definition, die Definition und die sofort den Aufruf einer Funktion im zweiten Beispiel. Sie sind ähnlich, weil Sie die Funktion Ausdruck in dem ersten Beispiel ist nur die definition der Funktion.
Gibt es andere mehr natürlich nützlich Fällen für die Berufung Ausdrücken, auflösen, um die Funktionen:
InformationsquelleAutor der Antwort Triptych
Gibt es keinen Unterschied jenseits der syntax.
Bezüglich Ihrer Bedenken über die zweite Methode, es zu tun:
Betrachten:
(function namedfunc () { ... }())
namedfunc
noch nicht in den globalen Bereich, obwohl Sie die Namen. Das gleiche gilt für anonyme Funktionen. Der einzige Weg, um es in diesem Rahmen wäre die Zuweisung an eine variable in die Klammern.Die äußeren Klammern sind unnötig:
Aber Sie wollte nicht, dass das Globale Deklaration anyways, hast du?
So es auf die es hinausläuft:
Und Sie können es reduzieren, noch weiter: der name ist überflüssig, da es nie verwendet werden (es sei denn, Ihre Funktion ist rekursiv.. und selbst dann könnten Sie
arguments.callee
)Das ist, so denke ich darüber (kann falsch sein, habe ich nicht gelesen die ECMAScript-Spezifikation noch). Hoffe, es hilft.
InformationsquelleAutor der Antwort Cristian Sanchez
Den Unterschied nur existieren, weil Douglas Crockford nicht wie der erste style für IIFEs! (seriuosly) Wie sehen Sie in diesem video!!.
Der einzige Grund für die Existenz der extra-Verpackung
()
{in beiden Stilen} ist zu helfen, machen, dass code-Abschnitt, der Funktion Ausdruckweil Funktion Erklärung nicht sofort genannt. Einige Skripte /verkleinern-ers verwenden Sie einfach+
!
-
&~
statt zu Klammern. Wie diese:Und all diese sind genau die gleichen wie Ihre alternativen. Die Wahl unter diesen Fällen vollständig auf Ihren eigenen & macht keinen Unterschied. { Diejenigen, die mit
()
produzieren 1 Byte größere Datei 😉 }InformationsquelleAutor der Antwort Behrad Khodayar