1464 votes

Quel est le point d'exclamation faire avant la fonction?

!function () {}();

2421voto

Neil Points 24938

La syntaxe JavaScript 101. Voici une déclaration de fonction:

function foo() {}

Notez qu'il n'y a pas de point-virgule: c'est une déclaration, vous avez besoin d'un autre invocation de l' foo() pour exécuter la fonction.

D'autre part, !function foo() {} est une expression, mais ce n'est pas pour appeler la fonction, mais nous pouvons maintenant utiliser !function foo() {}() le faire, comme () a une priorité plus élevée que !. Sans doute l'exemple original de la fonction n'a pas besoin d'une auto-référence, de sorte que le nom peut alors être supprimée.

Donc, ce que l'auteur est en train de faire est de sauver un octet par la fonction d'expression, un moyen plus lisible de l'écriture, ce serait celui-ci:

(function(){})();

420voto

Michael Burr Points 181287

La fonction:

function () {}

ne retourne rien (ou non).

Parfois, nous voulons appeler une fonction à droite comme nous le créons. Vous pourriez être tenté d'essayer ceci:

function () {}()

mais il en résulte un SyntaxError.

À l'aide de l' ! de l'opérateur avant que la fonction fait être considéré comme une expression, si on peut l'appeler:

!function () {}()

Cela permettra également de retour le booléen à l'opposé de la valeur de retour de la fonction, dans ce cas - truecar !undefined est true. Si vous voulez que la valeur de retour d'être le résultat de l'appel, puis essayez de le faire de cette façon:

(function () {})()

79voto

dmi3y Points 1520

Il est un bon point pour l'utilisation ! pour l'invocation de la fonction marqué sur aibnb javascript guide

Généralement l'idée d'utiliser cette technique sur des fichiers séparés (aka modules) qui, plus tard, d'obtenir concaténées. Mise en garde ici est que les fichiers censé être concaténés par des outils qui mettre le nouveau fichier à la nouvelle ligne (qui de toute façon est un comportement commun pour la plupart des concat outils). Dans ce cas, l'aide d' ! aidera à éviter les erreurs dans le cas concaténées module manqué point-virgule de fin, et pourtant qui donnera la souplesse nécessaire pour mettre dans n'importe quel ordre avec pas de soucis.

!function abc(){}()
!function bca(){}();

Fonctionnera même que

!function abc(){}()
;(function bca(){})();

mais permet d'économiser les deux personnages et l'arbitraire de l'air mieux.

Et par la façon dont les de la +,-,~ de la séquence d'avoir le même effet, dans les conditions de l'invocation de la fonction, pour sûr, si vous avez quelque chose de l'utilisation de retour de cette fonction qu'ils agissent différemment.

abcval = !function abc(){return true;}() // abcval equals false
bcaval = +function bca(){return true;}() // bcaval equals 1
zyxval = -function zyx(){return true;}() // zyxval equals -1
xyzval = ~function xyz(){return true;}() // your guess?

mais si vous utilisez IIFE modèles pour un fichier un module de séparation du code et à l'aide de concat outil pour l'optimisation (ce qui fait une ligne d'un fichier de travail), de la construction

!function abc(/*no returns*/) {}()
+function bca() {/*no returns*/}()

Va faire fort d'exécution de code, de même que d'un premier exemple de code.

Celui-ci va jeter erreur cause JavaScirpt ASI ne sera pas en mesure de faire son travail.

!function abc(/*no returns*/) {}()
(function bca() {/*no returns*/})()

Une remarque concernant l' ^,&,*,, - éléments, ils font un travail semblable, mais seulement dans le cas où ils ont utilisé pas dans le premier module. Donc ils ne sont pas si sûr, si vous n'avez pas un contrôle total sur le concatination commande.

Ceci fonctionne:

!function abc(/*no returns*/) {}()
^function bca() {/*no returns*/}()

Ce n':

^function abc(/*no returns*/) {}()
!function bca() {/*no returns*/}()

33voto

gilly3 Points 33285

Il retourne si la déclaration peut évaluer à false. par exemple:

!false      // true
!true       // false
!isValid()  // is not valid

Vous pouvez l'utiliser deux fois de forcer une valeur booléenne:

!!1    // true
!!0    // false

Donc, pour plus de répondre directement à votre question:

var myVar = !function(){ return false; }();  // myVar contains true

Edit: Il a pour effet de bord de l'évolution de la déclaration de la fonction pour une instruction de fonction, permettant à la fonction qui doit être exécutée immédiatement. C'est à dire, le code suivant n'est pas valide parce que c'est une déclaration de fonction et non pas une déclaration:

function() { return false; }();  // syntax error

10voto

oozzal Points 408

Et voici quelque chose de plus, j'ai réalisé à partir de la console. Comme mentionné précédemment, le point d'exclamation fait le retour de la fonction booléenne.

Pour la dernière de la syntaxe:

( function my_function() {} )()

Nous pouvons faire quelque chose comme:

(function add_them(a,b) { return a+b;} )(9,4)

Comme simultanée de la fonction de définition et d'appel.

Edit:
Maintenant vous demander quelle est l'utilité de '!' type de définition de la fonction. Considérons le texte suivant:

!function a_would_be_function() { alert("Do some junk but inside a function"); }()

vous voulez exécuter une fonction comme ci-dessus, mais sans un '!' génère une erreur. Espère que je suis clair.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X