Was ist der Unterschied zwischen dieser Implementierung der selbst-ausführenden anonymen Funktion (alias IIFE)

9

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

  1. Warum ist die erste Implementierung für JSLint nicht gut genug? Was sind die Unterschiede?
  2. Was ist die bevorzugte Form? ist JSLint immer richtig?
  3. Warum funktioniert es? nachdem function(){}() eine SyntaxError: Unexpected token ( wirft

    Aber es mit Parens zu verpacken macht es plötzlich Arbeit? z.B. ( function(){}() ) - funktioniert einwandfrei
    (Nach all dem ist JavaScript, nicht Lisp, also was ist der Effekt der Wrapping-Paren auf den mehrfachen Syntaxfehler?)

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?

    
Eran Medan 16.04.2013, 00:39
quelle

2 Antworten

5
Ich weiß nicht, wie Crockfords Meinungen entwickelt wurden, aber ich kann erklären, warum das Wrappen in Parens funktioniert.

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.

%Vor%

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 ~ :

%Vor%     
Jeremy Banks 16.04.2013, 00:47
quelle
1

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.

    
Travis J 16.04.2013 00:47
quelle

Tags und Links