Ich habe kürzlich die aktuelle Version von json2.js mit der Version in meinem Projekt verglichen und festgestellt, dass der Funktionsausdruck anders erstellt und selbst ausgeführt wurde.
Der Code, mit dem eine anonyme Funktion in Klammern eingeschlossen und dann ausgeführt wird.
(function () {
// code here
})();
Jetzt wird die automatisch ausgeführte Funktion in Klammern gesetzt.
(function () {
// code here
}());
In der akzeptierten Antwort von Explain JavaScript's gekapselter anonymer Funktionssyntax gibt es einen Kommentar von CMS , der "beides: (function(){})();
und (function(){}());
gültig" lautet .
Ich habe mich gefragt, was der Unterschied ist. Nimmt der erstere Speicher auf, indem er eine globale, anonyme Funktion verlässt? Wo soll sich die Klammer befinden?
javascript
syntax
anonymous-function
iife
Kevin Hakanson
quelle
quelle
Antworten:
Sie sind praktisch gleich.
Der erste umschließt eine Funktion in Klammern, um sie zu einem gültigen Ausdruck zu machen, und ruft sie auf. Das Ergebnis des Ausdrucks ist undefiniert.
Der zweite führt die Funktion aus und die Klammern um den automatischen Aufruf machen ihn zu einem gültigen Ausdruck. Es wird auch als undefiniert ausgewertet.
Ich glaube nicht, dass es einen "richtigen" Weg gibt, da das Ergebnis des Ausdrucks dasselbe ist.
quelle
+function(){}()
oder ist!function(){}()
.-function(){}();
,!function(){}();
, und im Grunde jede andere Betreiber kurz vorfunction
auch Arbeit, aber ich Versionen bleiben würde mit Pars). Ich sehe das erste viel mehr als das zweite, und es ist meine Präferenz; es macht auch für mich mehr Sinn, aber das ist subjektiv. FWIW: jsbin.com/ejaqowIn diesem Fall spielt es keine Rolle. Sie rufen einen Ausdruck auf, der in der ersten Definition in eine Funktion aufgelöst wird, und definieren im zweiten Beispiel eine Funktion und rufen sie sofort auf. Sie sind ähnlich, da der Funktionsausdruck im ersten Beispiel nur die Funktionsdefinition ist.
Es gibt andere offensichtlich nützlichere Fälle zum Aufrufen von Ausdrücken, die in Funktionen aufgelöst werden:
quelle
foo = function(){alert('hi');}
Wenn keine Funktion ist, wird ein Fehler ausgegeben.foo
ausgegeben, wenn "wahr", aber keine Funktion ist.Über die Syntax hinaus gibt es keinen Unterschied.
In Bezug auf Ihre Bedenken hinsichtlich der zweiten Methode:
Erwägen:
(function namedfunc () { ... }())
namedfunc
wird immer noch nicht im globalen Bereich sein, obwohl Sie den Namen angegeben haben. Gleiches gilt für anonyme Funktionen. Die einzige Möglichkeit, es in diesen Bereich zu bringen, besteht darin, es einer Variablen innerhalb der Parens zuzuweisen.Die äußeren Parens sind unnötig:
Aber Sie wollten diese globale Erklärung sowieso nicht, oder?
Es läuft also darauf hinaus:
Und Sie können es noch weiter reduzieren: Der Name ist unnötig, da er niemals verwendet wird (es sei denn, Ihre Funktion ist rekursiv .. und selbst dann könnten Sie verwenden
arguments.callee
)So denke ich darüber nach (möglicherweise falsch, ich habe die ECMAScript-Spezifikation noch nicht gelesen). Ich hoffe es hilft.
quelle
arguments.callee
seit ES5 veraltet ist (und im strengen Modus verboten ist).Der Unterschied besteht nur darin, dass Douglas Crockford den ersten Stil für IIFEs nicht mag ! (seriuosly) Wie Sie in diesem Video sehen können !!.
Der einzige Grund für das Vorhandensein der zusätzlichen Umhüllung
()
{in beiden Stilen} besteht darin, diesen Abschnitt des Code- Funktionsausdrucks zu erstellen , da die Funktionsdeklaration nicht sofort aufgerufen werden kann. Einige Skripte / minify-ers nur nutzen+
,!
,-
&~
statt zu Klammern. So was:Und all dies sind genau die gleichen wie Ihre Alternativen. Die Auswahl unter diesen Fällen liegt ganz bei Ihnen und macht keinen Unterschied. {Diejenigen mit
()
produzieren 1 Byte größere Datei ;-)}quelle