2009-06-02 12 views
100

Es gibt eine JSLint Option, eine der guten Teile in der Tat, dass „Pars um sofortige Anrufungen [erfordert]“, was bedeutet, dass der BauImmediate Funktion Invokationssyntax

(function() { 

    // ... 

})(); 

stattdessen müssen geschrieben werden

Meine Frage ist das - kann jemand erklären, warum diese zweite Form besser betrachtet werden könnte? Ist es belastbarer? Weniger fehleranfällig? Welchen Vorteil hat es gegenüber der ersten Form?


Da diese Frage, ich bin gekommen, die Bedeutung eine klare visuelle Unterscheidung zwischen Funktionswerten und den Werten der Funktionen zu verstehen. Betrachten wir den Fall, wo das Ergebnis der sofortigen Aufruf ist die rechte Seite eines Zuweisungs expression:

var someVar = (function() { 

    // ... 

}()); 

Obwohl die äußersten Klammern syntaktisch nicht notwendig sind, gibt die öffnende Klammer eine Upfront-Anzeige, dass der Wert zugeordnet ist, ist nicht die Funktion selbst, sondern das Ergebnis der aufgerufenen Funktion.

Dies ist vergleichbar mit Crockfords Ratschlag bezüglich der Großschreibung von Konstruktorfunktionen - es soll jedem, der sich den Quellcode anschaut, als visueller Hinweis dienen.

+0

Dank für diesen Hinweis. Ich habe nie einen Weg gefunden, wie ich JSLints Warnmeldung "Seien Sie vorsichtig beim Erstellen von Funktionen innerhalb einer Schleife" loswerden kann. Ich war vorsichtig und stellte die Funktion in eine Schließung, aber JSLint beschwerte sich immer noch. Jetzt weiß ich, dass es angenommen hat, dass ich das zweite Muster verwendet habe. –

+0

Siehe auch [Unterschied zwischen (function() {})(); und function() {}();] (http://stackoverflow.com/q/423228/1048572) und mögliche Duplikate [Position von Klammern für die automatische Ausführung anonymer JavaScript-Funktionen?] (http://stackoverflow.com/ q/3384504/1048572) – Bergi

Antwort

61

Von Douglass Crockford style convention guide: (Suche nach „aufgerufen sofort“)

Wenn eine Funktion sofort aufgerufen werden, sollte der gesamte Aufrufausdruck in Pars gewickelt werden, so dass es klar ist, dass der Wert ist, produziert ist das Ergebnis der Funktion und nicht die Funktion selbst.

Also, im Grunde genommen fühlt er, dass es die Unterscheidung zwischen Funktionswerten und den Werten von Funktionen klarer macht. Es ist also eine stilistische Angelegenheit, nicht wirklich ein wesentlicher Unterschied im Code selbst.

aktualisierten Referenz, alte PPT nicht mehr existiert

+1

Ich bin froh, dass ich das gelesen habe. Ich habe gerade das Lesen von Javascript beendet: Die guten Teile, und was ich immer dachte, war, dass das Zuweisen des Ergebnisses des Aufrufs einer Funktion eine wirklich schlechte Syntax ist, weil man die erste und letzte Zeile betrachten muss, um zu verstehen, was passiert. Er benutzt nicht die Umschläge im Buch, aber ich sehe genau, warum er sie empfiehlt. – Skilldrick

+2

@altCognito, können Sie einen neuen Link für die PPT bereitstellen? – th1rdey3

+1

Ich schaute durch das Netz, aber ich kann immer noch keine Kopie von diesem PPT finden – Forethinker

1

sofort aufgerufen Anonyme Funktionen bekommen es in Pars gewickelt, weil:

  1. Sie Funktion Ausdrücke und verlassen Pars sind würde dazu führen, dass interpretiert werden als eine Funktionsdeklaration, die ein Syntaxfehler ist.

  2. Funktionsausdrücke können nicht mit der Wortfunktion beginnen.

  3. Beim Zuweisen des Funktionsausdrucks zu einer Variablen wird die Funktion selbst nicht zurückgegeben, der Rückgabewert der Funktion wird zurückgegeben , daher werten die Parens aus, was in ihnen enthalten ist, und erzeugen einen Wert. wenn die Funktion ausgeführt wird und die nachfolgenden Paren ..}() bewirken, dass die Funktion sofort ausgeführt wird.

+0

Dathan, Sie beantworten eine andere Frage. Sie haben Recht, dass die umschließenden Klammern manchmal syntaktisch notwendig sind, damit der Parser Funktionsausdrücke von Funktionsdeklarationen unterscheiden kann. Aber meine Frage betrifft die Platzierung der Aufrufklammern. Du bist der dritte Punkt ist ungenau; die umschließenden Klammern sind in diesem Fall nicht notwendig. –

+0

Ich beantwortete Ihr erstes Beispiel, bei dem die sofort aufgerufene anonyme Funktion keiner Variablen zugewiesen wurde und daher die Klammern aus den ersten beiden Gründen syntaktisch notwendig sind. Der dritte Grund bestand nur darin, das wiedereinzusetzen, was Sie gesagt haben: "Die öffnende Klammer gibt einen Hinweis darauf, dass der zugewiesene Wert nicht die Funktion selbst ist, sondern das Ergebnis der Funktion, die aufgerufen wird." Aber ich denke, es war nicht klar. – Dathan

-2

Oder verwenden:

void function() { 
... 
}()