Lage der Klammer für die automatische Ausführung anonyme 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 syntax, dass "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 sollen sich die Klammern befinden?
Verwandte: Unmittelbare Funktions-Aufruf-syntax (in JSLint)
Lesen Sie auch über die Zweck dieses Konstrukts, oder überprüfen Sie ein (technischer) Erläuterung (auch hier). Warum die Klammern sind erforderlich, siehe diese Frage.
InformationsquelleAutor 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.
Eigentlich sind Sie nicht beschränkt auf diese beiden, können Sie gerade über alles, das macht der compiler erkennen, die Funktion ist Teil eines Ausdrucks, und nicht eine Anweisung, wie
+function(){}()
oder!function(){}()
.JSLint will eine Menge Dinge, die spezifisch für Crockford ' s style statt als Substantiv. Dies ist einer von Ihnen.
Was würden Sie empfehlen? jQuery verwendet die ersten Stil und Crockford verwendet die zweite.
Ist es wirklich egal, also tun Sie, was Sie bevorzugen. Ich würde empfehlen, gegen einige der mehr outre-ones (
-function(){}();
,!function(){}();
, und im Grunde jeder andere operator, kurz bevorfunction
auch funktionieren, aber ich würde stick zu Versionen mit parens). Ich sehe die erste viel mehr als ich sehen, das zweite, und es ist meine Vorliebe, es macht mehr Sinn für mich als gut, aber das ist subjektiv. FWIW: jsbin.com/ejaqowInformationsquelleAutor meder omuraliev
In diesem Fall ist es egal. Werden Sie den Aufruf ein Ausdruck, der aufgelöst wird, um eine Funktion in der ersten definition und 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:
foo = function(){alert('hi');}
. Wenn keine Funktion, wird ein Fehler geworfen.Eine weitere Klarstellung - Es wird auch ein Fehler ausgelöst, wenn
foo
ist "truthy", nicht aber eine Funktion.InformationsquelleAutor 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.
arguments.callee
ist veraltet seit ES5 (und verboten im strikten Modus).InformationsquelleAutor 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 Ausdruck, weil 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 Behrad Khodayar