Zweck der äußeren zusätzlichen Klammer bei JavaScript-Schließfunktion [duplizieren]

8

Was ist der Zweck der äußeren zusätzlichen Klammern für die folgende JavaScript-Abschlussfunktion? Mir wurde in anderen Beiträgen gesagt, dass sie nicht unbedingt notwendig sind, aber sie sind eine Konvention, um klarzustellen, dass das Ergebnis der Funktion übergeben wird, nicht die Funktion selbst. Das folgende Zitat von Ссылка jedoch Konflikte. Was ist richtig?

  

Beachten Sie die () um die anonyme Funktion. Dies wird von der benötigt   Sprache, da Aussagen, die mit der Token-Funktion beginnen, sind   immer als Funktionserklärungen betrachtet. Einschließen () erstellt ein   Funktion Ausdruck stattdessen.

%Vor%     
user1032531 03.04.2013, 14:16
quelle

4 Antworten

5

Ich denke, dass verschiedene Engines unterschiedliche Interpretationsmöglichkeiten haben

function(){...}();

Der beliebteste und akzeptierte Weg, um es allen Engines verständlich zu machen, besteht darin, den Code in Klammern zu gruppieren.

(function(){...}());

Gleichzeitig macht das, was Sie zitierten, einen sehr interessanten Punkt. Ein Funktionsausdruck könnte gehen:

var f = function() {...}

Während eine Funktionsdeklaration wie folgt aussieht:

function f() {...}

Sie sehen, wie einfach / bequem es für den Parser ist, den Unterschied zu erkennen, indem er sich das erste Token anschaut?

%Vor%

Aber es wäre nicht sinnvoll, wenn Ihre (sofort aufgerufene) Funktion eine Funktionsdeklaration wäre (sie wird nicht wiederverwendet, Sie wollen nicht gehisst werden, oder im Namensraum usw.) ), so dass einige unschädliche Klammern hinzugefügt werden, ist eine gute Möglichkeit, darauf hinzuweisen, dass es sich um einen Funktionsausdruck handelt.

    
ktm5124 03.04.2013, 14:24
quelle
4

Zunächst muss ich aufklären:

%Vor%

ist äquivalent für

%Vor%

und auch für (Backbone.js verwendet es)

%Vor%

Zweitens, wenn Sie es so verwenden, ist es keine anonyme / Closure-Funktion. sein sofort aufgerufener Funktionsausdruck

würde als eine Schließung fungieren (weil nicht sofort aufgerufen wird ), wenn Sie den zurückgegebenen Kontext einer Variablen zuweisen. Dies ist nützlich, wenn Sie eine statische Klasse benötigen (wenn auf Eigenschaften und Methoden ohne Instanziierung zugegriffen werden kann). Zum Beispiel:

%Vor%
  

Was ist der Zweck der äußeren zusätzlichen Klammern auf dem folgenden   JavaScript-Schließfunktion?

Der Zweck ist nicht üblich und ziemlich seltsam - es geht nur um Funktionsargumente. Zum Beispiel

%Vor%

aber wenn wir sie an diese äußeren Klammern übergeben

%Vor%     
Yang 03.04.2013 15:26
quelle
3

Die zusätzlichen umgebenden Klammern unterscheiden einen Funktionsausdruck von einer regulären Funktionsdeklaration.

Obwohl die zusätzlichen Klammern Standard sind, kann das Gleiche erreicht werden, indem Sie stattdessen Folgendes tun:

%Vor%

Oder sogar:

%Vor%

Von diesen beiden Alternativen bevorzuge ich jedoch die void -Notation, weil uns in den meisten Fällen der Rückgabewert eines sofortigen Aufrufs nicht wirklich wichtig ist.

Andere Stellen, an denen die Klammern nicht benötigt werden, sind, wenn ein Ausdruck erwartet wird:

%Vor%     
Ja͢ck 03.04.2013 14:29
quelle
1

Sie sind notwendig, da der Parser im Funktionsdeklarationsmodus geht, wenn er

sieht %Vor%

in einem Anweisungskontext .

Nach function token erwartet es einen Namen für die Funktion, da eine Funktionsdeklaration einen Namen für die Funktion enthalten muss. Aber statt eines Namens wird stattdessen ( angezeigt, es handelt sich also um einen Syntaxfehler.

Ich denke, es könnte zurückverfolgen und eindeutig als Funktionsausdruck behandeln, tut es aber nicht.

%Code%

Oben ist var module = XXX in Ausdruck Kontext , wenn dort ein XXX erscheint, wird es als Start eines Funktionsausdrucks behandelt. Funktionsausdrücke müssen nicht haben ein Name für die Funktion, es ist also kein Syntaxfehler, dass function direkt nach ( erscheint.

So können Sie schreiben:

%Vor%

Aber nicht

%Vor%

Sie können viele Tricks anwenden, um das obige zu einem Ausdruck zu machen:

%Vor%

function befindet sich im Ausdruckskontext, da es in Klammern eingeschlossen ist oder einem unären Operator folgt. Daher ist jede Funktion, die für XXX verwendet wird, ein Funktionsausdruck.

    
Esailija 03.04.2013 14:28
quelle

Tags und Links