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?
%Vor%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.
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.
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%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%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.
Tags und Links javascript closures