In vielen Büchern / Blogposts ist das selbstaufrufende anonyme Funktionsmuster ist so geschrieben:
%Vor%Wenn Sie jedoch JSLint ausführen, wird dieser Fehler angezeigt:
Verschiebe den Aufruf in die Parens, die die Funktion enthalten.
z.B. es zu ändern funktioniert so:
%Vor%Fragen
function(){}()
eine SyntaxError: Unexpected token (
wirft function(){}()
) - funktioniert einwandfrei
BEARBEITEN : Dies ist eine Folge davon (ich würde jedoch nicht genaues Duplikat sagen): JSLint Fehler:" Verschieben Sie den Aufruf in die Parens, die die Funktion enthalten ", so dass meine Hauptfrage # 3 ist, Warum funktioniert es überhaupt?
Die Funktion function() { ... }
Syntax in JavaScript kann zwei verschiedene Dinge darstellen: eine Funktionsdeklaration oder einen Funktionsausdruck.
Eine Funktionsdeklaration ist eine -Anweisung , die die Funktion innerhalb des aktuellen Bereichs unter dem angegebenen Namen definiert.
%Vor% Ein Funktionsausdruck ist ein Ausdruck , der zu einer neuen Function
Instanz ausgewertet wird.
Ob ein Auftreten der Syntax eine Funktionsdeklaration oder eine Funktionsanweisung ist, hängt davon ab, was der Parser erwartet hat. Der JavaScript-Parser ist einfach. Es wird nicht nach vorne schauen und bemerken, dass der Funktion ()
folgt, daher sollte es als Ausdruck behandelt werden. Es sieht nur das function
am Anfang einer Zeile und behandelt es daher als eine Anweisung, die einen Syntaxfehler verursacht, wenn auf ()
folgt. Wenn Sie es in Klammern umbrechen, erwartet der Parser stattdessen einen Ausdruck, und es funktioniert.
Das Umbrechen in Klammern (wo auch immer Sie sie platzieren) ist der klarste Weg, dies zu tun, aber alles, was den Parser dazu bringt, einen Ausdruck zu erwarten, wird funktionieren. Zum Beispiel der bitweise NOT-Operator ~
:
1.
Offensichtlich ist dies ein Problem mit Konventionen. Das erste Beispiel zeigt ein "Mangel an Konvention" ( Quelle ). Soweit es tatsächliche Unterschiede gibt, gibt es keine. Beide werden ohne Fehler ausgeführt.
2.
In diesem Fall bevorzuge ich dein erstes Beispiel, aber das ist nur meine Konvention. JSLint hat oft Recht. Wenn Sie also ihren Namenskonventionen folgen wollen, dann wäre es sinnvoll, wenn sie eine Warnung basierend auf der Konvention anzeigen, der Konvention zu entsprechen.
3.
Das funktioniert, weil das Umschließen des function(){}
innerhalb eines ()
es zu einem Ausdruck macht, der, sobald es mit dem letzten ()
gepaart wurde, es sofort aufruft. Daher haben Sie einen sofort aufgerufenen Funktionsausdruck.
Tags und Links javascript