JavaScript-Pluszeichen vor Funktionsausdruck

Antworten:

1321

Es zwingt den Parser, den folgenden Teil +als Ausdruck zu behandeln . Dies wird normalerweise für Funktionen verwendet, die sofort aufgerufen werden, z.

+function() { console.log("Foo!"); }();

Ohne die +dort, wenn der Parser in einem Zustand ist , wo es eine Erklärung erwartet (die einen Ausdruck oder mehrere nicht-Ausdruck Aussagen sein kann), das Wort functionsieht aus wie der Anfang einer Funktion Erklärung statt einer Funktion Ausdruck und so das ()es folgende (die am Ende der obigen Zeile) wäre ein Syntaxfehler (ebenso wie das Fehlen eines Namens in diesem Beispiel). Mit dem +wird es zu einem Funktionsausdruck, was bedeutet, dass der Name optional ist und zu einem Verweis auf die Funktion führt, der aufgerufen werden kann, sodass die Klammern gültig sind.

+ist nur eine der Optionen. Es kann auch sein -, !, ~, oder einfach über jeden anderen unären Operator. Alternativ können Sie Klammern verwenden (dies ist häufiger, aber syntaktisch weder mehr noch weniger korrekt):

(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());
TJ Crowder
quelle
12
Weitere Informationen finden Sie
Kundan Singh Chouhan
159
Können wir nicht sagen, dass das Paren-Wrapping eine überlegene Notation ist? Ich bin sehr vertraut mit Parens, die dazu dienen, Ausdrücke zu erfassen. Es ist überhaupt nicht klar, was + in diesem Fall tut, wenn Sie diese arkane Eigenart von js noch nicht kennen.
Chris
1
Hinweis: Von den beiden Parens-Optionen bevorzugt jsLint die zweite. Ich denke, jsHint ist weniger pingelig.
Rote Beete-Rote Beete
43
Eine der am häufigsten verwendeten Bibliotheken, die die Pluszeichen-Notation verwenden, ist Bootstrap (so habe ich diesen Thread gelesen).
Ville
Bootstrap macht das übrigens: maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.js
xanderiel
95

Die Tochtergesellschaft der Antwort von @ TJCrowder +wird normalerweise verwendet, um das numerische Umwandeln eines Werts zu erzwingen, wie in dieser SO-Antwort erläutert . In diesem Fall wird es als "unärer Plus-Operator" bezeichnet (zur Erleichterung des Googelns).

var num = +variant;

Vor einer Funktion kann dies eine Möglichkeit sein, die Interpretation des Funktionsergebnisses als Zahl zu erzwingen. Ich bezweifle, dass dies noch passiert, aber theoretisch könnte die JIT dies verwenden, um die Funktion als reine numerische Funktion usw. zu kompilieren. Um jedoch zu verhindern, dass das unäre Plus eine Verkettung darstellt, wenn es in einem größeren Ausdruck verwendet wird, benötigen Sie Klammern:

blah + (+(function(){ var scope; return "4"; })());
Phil H.
quelle
3
Wie kam es jemals zu 37 Upvotes? Die (+function() { ... })()Notation kann niemals fehlerfrei ausgeführt werden (abgesehen davon, dass dies die Frage nicht beantwortet).
Whitequark
6
@whitequark: Ein paar Klammern um die Funktion + Aufruf fehlen. Vermutlich waren die Gegenstimmen eher wegen der Erklärung der Zahlenbesetzung.
Phil H
10
OK, ich hätte vielleicht nicht picken können.
Whitequark
2
@Christoph Ich würde gerne diese Klammern dort lassen. Tatsächlich würde ich so weit gehen, sie hinzuzufügen, wenn sie fehlen würden. Es macht viel klarer, was los ist, und verhindert auch Probleme, wenn der Code minimiert wird, indem die Leerzeichen entfernt werden, was dazu führt, dass 3++function...dies nicht dasselbe ist.
Benjam
3
Obwohl bei weiterer Überlegung, ist das an +function...sich unnötig. Es kann das gleiche Ergebnis erzielt werden, bei blah + function( ){ ... }( );dem die Notwendigkeit der Umhüllungsklammern entfällt.
Benjam
61

Die kurze Antwort lautet also, dass ein Syntaxfehler verhindert wird, indem die Funktionsergebnisse auf die eine oder andere Weise verwendet werden.

Sie können die Engine auch über den voidOperator anweisen, dass Sie nicht einmal am Rückgabewert interessiert sind:

void function() { console.log("Foo!"); }();

Diesem Zweck dient natürlich auch das Anbringen von Zahnspangen.

Jack
quelle
45
Leere oder Klammern sind immens vorzuziehen. Sie sind WTF-frei. Die Verwendung von + ist die Art von Klugheit, die nicht sehr klug ist.
Peter Wone
2
Ein guter Punkt. Es scheint, als würde die Verwendung eines der Betreiber gegen den derzeit branchenüblichen Standard verstoßen. Vielleicht würden sich "coole Kinder" -Entwickler dafür entscheiden, sonst sehe ich immer noch keinen
Grund