JavaScript plus signe devant l'expression de la fonction

868

Je cherchais des informations sur les fonctions immédiatement appelées, et quelque part je suis tombé sur cette notation:

+function(){console.log("Something.")}()

Quelqu'un peut-il m'expliquer ce que le +signe devant la fonction signifie / fait?

jOpacic
la source
17
Ben Alman explique tout ici: mths.be/iife
Mathias Bynens

Réponses:

1321

Il force l'analyseur à traiter la partie suivant l' +expression comme une expression. Ceci est généralement utilisé pour les fonctions qui sont appelées immédiatement, par exemple:

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

Sans le +là, si l'analyseur est dans un état où il attend une instruction (qui peut être une expression ou plusieurs instructions de non-expression), le mot functionressemble au début d'une déclaration de fonction plutôt qu'à une expression de fonction et donc le ()suivant (ceux à la fin de la ligne ci-dessus) serait une erreur de syntaxe (tout comme l'absence d'un nom, dans cet exemple). Avec le +, il en fait une expression de fonction, ce qui signifie que le nom est facultatif et qu'il en résulte une référence à la fonction, qui peut être invoquée, de sorte que les parenthèses sont valides.

+n'est qu'une des options. Il peut aussi être -, !, ~ou à peu près tout autre opérateur unaire. Alternativement, vous pouvez utiliser des parenthèses (c'est plus courant, mais ni plus ni moins syntaxiquement correct):

(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());
TJ Crowder
la source
12
Plus d'élaboration est ici, benalman.com/news/2010/11/…
Kundan Singh Chouhan
159
Ne pouvons-nous pas dire que le paren-wrapping est une notation supérieure? Je connais TRÈS bien les parens servant à englober les expressions. On ne sait pas du tout ce que + fait dans ce cas si vous ne connaissez pas déjà cette bizarrerie arcanique de js.
Chris
1
Remarque: Parmi les deux options de parens, jsLint préfère la seconde. Je pense que jsHint est moins difficile.
Beetroot-Beetroot
43
L'une des bibliothèques couramment utilisées qui utilise la notation «plus» est Bootstrap (c'est ainsi que j'ai fini par lire ce fil).
Ville
95

Subsidiaire à la réponse de @ TJCrowder, +est généralement utilisé pour forcer la conversion numérique d'une valeur comme l'explique cette réponse SO . Dans ce cas, il est appelé «opérateur unaire plus» (pour faciliter la recherche sur Google).

var num = +variant;

Ainsi, devant une fonction, cela peut être un moyen de forcer le résultat de la fonction à être interprété comme un nombre. Je doute que cela se produise encore, mais théoriquement, le JIT pourrait l'utiliser pour compiler la fonction en tant que fonction uniquement numérique, etc. Cependant, pour éviter que l'unaire plus soit une concaténation lorsqu'il est utilisé dans une expression plus grande, vous auriez besoin de parenthèses:

blah + (+(function(){ var scope; return "4"; })());
Phil H
la source
3
Comment cela a-t-il pu obtenir 37 votes positifs? La (+function() { ... })()notation ne peut jamais s'exécuter sans erreurs (à part le fait que cela ne répond pas à la question).
whitequark
6
@whitequark: Vous avez manqué une paire d'accolades autour de la fonction + appel. Je soupçonne que les votes positifs étaient plus dus à l'explication du casting des numéros.
Phil H
10
OK, j'aurais peut-être tâtonné.
whitequark
2
@Christoph Je serais enclin à laisser ces parenthèses là. En fait, j'irais jusqu'à les ajouter s'ils manquaient. Cela rend beaucoup plus clair ce qui se passe et évite également les problèmes lorsque le code est minimisé en supprimant les espaces, ce 3++function...qui conduit à ce qui n'est pas le même.
Benjam
3
Bien que, après réflexion, le +function...soit inutile en soi. Le même résultat peut être obtenu, blah + function( ){ ... }( );ce qui éliminerait le besoin de supports d'emballage.
Benjam
61

Donc, la réponse courte est qu'elle empêche une erreur de syntaxe, en utilisant les résultats de la fonction d'une manière ou d'une autre.

Vous pouvez également indiquer au moteur que la valeur de retour ne vous intéresse même pas en utilisant l' voidopérateur:

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

Bien sûr, mettre des accolades autour de tout cela sert également cet objectif.

Jack
la source
45
Le vide ou les parenthèses sont extrêmement préférables. Ils sont sans WTF. Utiliser + est le genre d'intelligence qui n'est pas très intelligent.
Peter Wone
2
Un bon point. Il semble que l'utilisation de l'un des opérateurs irait à l'encontre de ce qui est actuellement la norme de l'industrie. Peut-être que les développeurs "cool kid" opteraient pour cela, sinon je ne vois toujours pas l'intérêt d'utiliser quelque chose plutôt que void ou ()
dudewad