2009-04-15 5 views

Antwort

14

Javascript hat keinen Blockbereich, daher ist dies eine Möglichkeit, einen temporären lokalen Bereich zu erstellen, der den globalen Namespace nicht verschmutzt. Die Klammern dienen zwei Zwecken:

  1. Einige Implementierungen von Javascript ausklappen, wenn sie fehlen.
  2. Es signalisiert den Lesern, dass etwas anderes als eine normale Funktionsdeklaration vor sich geht. Als Konvention signalisiert es, dass diese Funktion als Scope verwendet wird.

siehe hier: http://peter.michaux.ca/articles/an-important-pair-of-parens

+0

schlagen Sie mich dazu +1 –

6

In Safari 4 führt der folgende Code (ohne die Klammern) zu "SyntaxError: Parse error":

function() { alert("Test"); }(); 

... aber der folgende Code funktioniert wie erwartet:

(function() { alert("Test"); })(); 

aktualisieren: Ich habe auch versucht, den Code in Firefox 3 (via Firebug), und es verhielt sich genauso wie Safari.

0

Soweit ich weiß, besteht der einzige Unterschied darin, dass letzteres manchmal in bestimmten Varianten von ECMAScript nicht funktioniert (nämlich ActionScript, aber es könnte auch andere geben).

2

Der Grund

function() { return val;}(); 

nicht der Fall funktioniert, weil es eine Funktion Aussage ist, kein Ausdruck. Es ist ein ziemlich kleiner Unterschied, aber im Grunde, wenn die Anweisung mit function beginnt, ist es genau wie eine C-Funktionsdeklaration, und Sie können die Funktion nicht aufrufen, weil es keinen Ausdruckswert gibt.

Das Hinzufügen der Klammern macht die Funktionsdefinition Teil eines Ausdrucks, so dass es einen Wert hat und aufgerufen werden kann.

Durch die Zuweisung des Rückgabewerts der Funktion werden auch keine Klammern mehr benötigt, da die Funktionsdefinition nicht die gesamte Anweisung ist. Zum Beispiel dieser Arbeit:

var value = function() { alert("works"); return 0; }(); 
(function() { alert("works"); })(); 

aber nicht:

function() { alert("doesn't work"); }(); 

I sind stets bemüht, die Klammern, auch wenn sie nicht notwendig ist, weil sie es leichter zu sehen, machen, dass ich Aufruf der Funktion, anstatt sie einer Variablen zuzuordnen.

+0

Absolut richtig. Siehe auch hier: http://yura.thinkweb2.com/named-function-expressions/#expr-vs-de-cl – user123444555621