Syntax für sofortigen Funktionsaufruf

110

Es gibt eine JSLint- Option, eine der guten Teile in der Tat, die "Parens um unmittelbare Aufrufe erfordert", was bedeutet, dass die Konstruktion

(function () {

  // ...

})();

müsste stattdessen geschrieben werden als

(function () {

  // ...

}());

Meine Frage lautet: Kann jemand erklären, warum diese zweite Form als besser angesehen werden könnte? Ist es widerstandsfähiger? Weniger fehleranfällig? Welchen Vorteil hat es gegenüber der ersten Form?


Seit ich diese Frage gestellt habe, habe ich verstanden, wie wichtig es ist, eine klare visuelle Unterscheidung zwischen Funktionswerten und Funktionswerten zu treffen. Stellen Sie sich den Fall vor, in dem das Ergebnis eines sofortigen Aufrufs die rechte Seite eines Zuweisungsausdrucks ist:

var someVar = (function () {

  // ...

}());

Obwohl die äußersten Klammern syntaktisch nicht erforderlich sind, gibt die öffnende Klammer im Voraus einen Hinweis darauf, dass der zugewiesene Wert nicht die Funktion selbst ist, sondern das Ergebnis des Aufrufs der Funktion.

Dies ähnelt Crockfords Rat bezüglich der Großschreibung von Konstruktorfunktionen - es soll als visueller Hinweis für jeden dienen, der sich den Quellcode ansieht.

Bobby Eickhoff
quelle
Vielen Dank für den Hinweis. Ich habe nie einen Weg gefunden, die Warnmeldung von JSLint zu entfernen: "Seien Sie vorsichtig, wenn Sie Funktionen innerhalb einer Schleife ausführen." Ich war vorsichtig und habe die Funktion geschlossen, aber JSLint hat sich trotzdem beschwert. Jetzt weiß ich, dass davon ausgegangen wurde, dass ich das zweite Muster verwendet habe.
viam0Zah
Ich habe es die ganze Zeit "falsch" gemacht. Und wenn ich "die ganze Zeit" sage, schreibe ich seit 1995 JavaScript.
Dave Land

Antworten:

73

Aus Douglass Crockfords Style Convention Guide : (Suche nach "sofort aufgerufen")

Wenn eine Funktion sofort aufgerufen werden soll, sollte der gesamte Aufrufausdruck in Parens eingeschlossen werden, damit klar ist, dass der erzeugte Wert das Ergebnis der Funktion und nicht der Funktion selbst ist.

Er ist der Meinung, dass dies die Unterscheidung zwischen Funktionswerten und Funktionswerten klarer macht. Es handelt sich also um eine stilistische Angelegenheit, nicht wirklich um einen wesentlichen Unterschied im Code selbst.

aktualisierte Referenz, alte PPT existiert nicht mehr

cgp
quelle
1
Ich bin froh, dass ich das gelesen habe. Ich habe gerade Javascript: The Good Parts gelesen und dachte immer wieder, dass das Zuweisen des Ergebnisses beim Aufrufen einer Funktion eine wirklich schlechte Syntax ist, da man sich die erste und letzte Zeile ansehen muss, um zu verstehen, was passiert. Er benutzt die Verpackungsparens im Buch nicht, aber ich verstehe genau, warum er sie empfiehlt.
Skilldrick
2
@altCognito, können Sie einen neuen Link für die PPT bereitstellen?
th1rdey3
1
Ich habe im Internet
nachgesehen
1
Ich konnte die ursprüngliche PPT nicht finden, aber ich konnte den gleichen Punkt finden, der in seinem Javascript-Konventionsleitfaden gefunden wurde.
CGP
archive.org haben es?
John Greene
2

Sofort aufgerufene anonyme Funktionen werden in Parens verpackt, weil:

  1. Sie sind Funktionsausdrücke, und das Auslassen von Parens würde dazu führen, dass sie als Funktionsdeklaration interpretiert werden, die ein Syntaxfehler ist.

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

  3. Wenn Sie den Funktionsausdruck einer Variablen zuweisen, wird die Funktion selbst nicht zurückgegeben, sondern der Rückgabewert der FunktionDaher bewerten die Eltern, was in ihnen ist, und produzieren einen Wert.Wenn die Funktion ausgeführt wird und die nachfolgenden Parens ..}()die Funktion sofort ausführen.

Dathan
quelle
Dathan, du beantwortest eine andere Frage. Sie haben Recht, dass die einschließenden Klammern manchmal syntaktisch erforderlich sind, damit der Parser Funktionsausdrücke von Funktionsdeklarationen unterscheiden kann. Meine Frage betrifft jedoch die Platzierung der Aufrufklammern. Ihr dritter Punkt ist ungenau; Die einschließenden Klammern sind in diesem Fall nicht erforderlich.
Bobby Eickhoff
Ich habe Ihr erstes Beispiel beantwortet, bei dem die Funktion "Sofort aufgerufene anonyme Person" keiner Variablen zugewiesen wurde und daher die Klammern aus den ersten beiden Gründen syntaktisch erforderlich sind. Der dritte Grund war nur die Wiedereinsetzung dessen, was Sie sogar gesagt haben: "Die öffnende Klammer gibt im Voraus einen Hinweis darauf, dass der zugewiesene Wert nicht die Funktion selbst ist, sondern das Ergebnis des Aufrufs der Funktion." Aber ich denke es war nicht klar.
Dathan
-3

Oder verwenden Sie:

void function () {
...
} ()
Agamemnus
quelle