Die Art, wie ich dies normalerweise den Leuten erklärt, ist zu zeigen, wie es mit anderen JavaScript-Mustern vergleichbar ist.
Zunächst sollten Sie wissen, dass es zwei Möglichkeiten, eine Funktion zu deklarieren (eigentlich gibt es mindestens fünf, aber diese sind die beiden Hauptschuldigen):
function foo() {/*code*/}
und
var foo = function() {/*code*/};
Auch wenn diese Konstruktion seltsam aussieht, verwenden Sie sie wahrscheinlich immer beim Anhängen von Ereignissen:
sollten Sie beachten, dass die zweite Form von einer regulären Variablendeklaration ist nicht viel anders:
var bar = 5;
var baz = 'some string';
var foo = function() {/*code*/};
Aber in JavaScript, um Sie immer die Wahl haben einen Wert direkt oder über eine Variable zwischen der Verwendung. Wenn bar
5
ist, dann werden die nächsten beiden Aussagen sind äquivalent:
var myVal = bar * 100; // use 'bar'
var myVal = 5 * 100; // don't use 'bar'
Nun, wenn Sie 5
auf eigene verwenden können, warum können Sie function() {\*code*\}
nicht zu sehr auf seine eigene benutzen? In der Tat können Sie. Und das nennt man eine anonyme Funktion.Also diese zwei Beispiele sind gleichwertig:
Der einzige Unterschied, den Sie sehen sollten, ist in den zusätzlichen Klammern. Das liegt einfach daran, dass wenn Sie eine Zeile mit dem Schlüsselwort function
starten, der Parser denkt, dass Sie eine Funktion deklarieren, indem Sie das erste Muster am Anfang dieser Antwort verwenden, und eine Syntaxfehlerausnahme auslösen. Umhüllen Sie also Ihre gesamte anonyme Funktion in zwei geschweifte Klammern und das Problem verschwindet.
Mit anderen Worten sind die folgenden drei Aussagen gültig:
5; // pointless and stupid
'some string'; // pointless and stupid
(function(){/*code*/}()); // wonderfully powerful
sind Sie an einer "formalen Erklärung" interessiert, in Bezug auf die ECMA-262-Spezifikation? – CMS
Lesen Sie über den [Zweck dieses Konstrukts] (http://stackoverflow.com/q/592396/1048572). Werfen Sie einen Blick auf eine nicht-technische [Erklärung] (http://stackoverflow.com/q/8228281/1048572), auch [hier] (http://stackoverflow.com/a/441498/1048572). Für die Syntax siehe [warum die Klammern erforderlich sind] (http://stackoverflow.com/q/1634268/1048572) und [wohin sie gehen sollten] (http://stackoverflow.com/q/3384504/1048572) . – Bergi