!function () {}();
javascript
function
Sebastian Otto
la source
la source
Réponses:
Syntaxe JavaScript 101. Voici une déclaration de fonction :
Notez qu'il n'y a pas de point-virgule: c'est juste une déclaration de fonction . Vous auriez besoin d'une invocation
foo()
pour exécuter la fonction.Maintenant, lorsque nous ajoutons le point d'exclamation apparemment inoffensif:
!function foo() {}
il le transforme en une expression . C'est maintenant une expression de fonction .Le
!
seul n'invoque pas la fonction, bien sûr, mais nous pouvons maintenant mettre()
à la fin:!function foo() {}()
qui a une priorité plus élevée que!
et appelle instantanément la fonction.Donc, ce que l'auteur fait, c'est enregistrer un octet par expression de fonction; une façon d'écrire plus lisible serait la suivante:
Enfin,
!
rend l'expression return true. C'est parce que par défaut tous les retours IIFEundefined
, ce qui nous laisse ce!undefined
qui esttrue
. Pas particulièrement utile.la source
!
renvoie booléen, nous le savons tous, mais le grand point que vous faites est qu'il convertit également l'instruction de déclaration de fonction en une expression de fonction afin que la fonction puisse être immédiatement invoquée sans la mettre entre parenthèses. Pas évident, et clairement l'intention du codeur.var foo =
brise l'ambiguïté de l'expression / expression et vous pouvez simplement écrirevar foo = function(bar){}("baz");
etc.La fonction:
ne renvoie rien (ou non défini).
Parfois, nous voulons appeler une fonction dès que nous la créons. Vous pourriez être tenté d'essayer ceci:
mais il en résulte un
SyntaxError
.L'utilisation de l'
!
opérateur avant la fonction la traite comme une expression, nous pouvons donc l'appeler:Cela renverra également l'opposé booléen de la valeur de retour de la fonction, dans ce cas
true
, car!undefined
istrue
. Si vous souhaitez que la valeur de retour réelle soit le résultat de l'appel, essayez de le faire de cette façon:la source
!
est de transformer la déclaration de fonction en une expression de fonction, c'est tout.!function
syntaxeIl y a un bon point à utiliser
!
pour l'invocation de fonctions marqué sur le guide JavaScript airbnbIdée générale pour utiliser cette technique sur des fichiers séparés (aka modules) qui seront ensuite concaténés. La mise en garde ici est que les fichiers sont censés être concaténés par des outils qui placent le nouveau fichier à la nouvelle ligne (ce qui est de toute façon un comportement courant pour la plupart des outils de concaténation). Dans ce cas, l'utilisation
!
aidera à éviter les erreurs dans le cas où le module précédemment concaténé manquerait un point-virgule de fin, et pourtant cela donnera la flexibilité de les mettre dans n'importe quel ordre sans souci.Fonctionnera de la même manière que
mais enregistre un caractère et arbitraire semble mieux.
Et par la manière que ce soit
+
,-
,~
, lesvoid
opérateurs ont le même effet, en termes d'invoquer la fonction, bien sûr si vous devez utiliser quelque chose pour revenir de cette fonction , ils agiraient différemment.mais si vous utilisez des modèles IIFE pour la séparation de code d'un module et d'un fichier et utilisez l'outil de concaturation pour l'optimisation (ce qui fait une tâche sur un seul fichier), alors la construction
Réalisera l'exécution de code en toute sécurité, comme un tout premier exemple de code.
Celui-ci générera une erreur car JavaScript ASI ne pourra pas faire son travail.
Une remarque concernant les opérateurs unaires, ils feraient un travail similaire, mais seulement au cas où, ils ne l'auraient pas utilisé dans le premier module. Ils ne sont donc pas si sûrs si vous n'avez pas un contrôle total sur l'ordre de concaténation.
Cela marche:
Ce n'est pas:
la source
Il retourne si l'instruction peut évaluer false. par exemple:
Vous pouvez l'utiliser deux fois pour contraindre une valeur à booléenne:
Donc, pour répondre plus directement à votre question:
Edit: Cela a pour effet secondaire de changer la déclaration de fonction en une expression de fonction. Par exemple, le code suivant n'est pas valide car il est interprété comme une déclaration de fonction à laquelle il manque l' identifiant (ou nom de fonction ) requis :
la source
var myVar = !function(){ return false; }()
pourrait omettre le!
mêmevar myVar = function(){ return false; }()
et la fonction s'exécutera correctement et la valeur de retour ne sera pas modifiée.true
par!0
etfalse
par!1
. Il enregistre 2 ou 3 caractères.C'est juste pour enregistrer un octet de données lorsque nous effectuons une minification javascript.
considérer la fonction anonyme ci-dessous
Pour faire de ce qui précède une fonction auto-invoquante, nous changerons généralement le code ci-dessus comme
Maintenant, nous avons ajouté deux caractères supplémentaires en
(,)
plus d'ajouter()
à la fin de la fonction ce qui était nécessaire pour appeler la fonction. Dans le processus de minification, nous nous concentrons généralement sur la réduction de la taille du fichier. Nous pouvons donc également écrire la fonction ci-dessus commeLes deux sont toujours des fonctions auto-appelantes et nous économisons également un octet. Au lieu de 2 caractères,
(,)
nous avons utilisé un seul caractère!
la source
! est un opérateur NOT logique , c'est un opérateur booléen qui inversera quelque chose à son opposé.
Bien que vous puissiez contourner les parenthèses de la fonction invoquée en utilisant le BANG (!) Avant la fonction, il inversera toujours le retour, ce qui n'est peut-être pas ce que vous vouliez. Comme dans le cas d'un IEFE, il retournerait indéfini , qui, lorsqu'il est inversé, devient le booléen true.
la source
Le point d'exclamation fait que toute fonction retourne toujours un booléen.
La valeur finale est la négation de la valeur retournée par la fonction.
Omettre
!
dans les exemples ci-dessus serait une SyntaxError .Cependant, une meilleure façon d'y parvenir serait:
la source
!
change la façon dont le runtime analyse la fonction. Il oblige le runtime à traiter la fonction comme une expression de fonction (et non une déclaration). Il le fait pour permettre au développeur d'appeler immédiatement la fonction à l'aide de la()
syntaxe.!
s'appliquera également (c'est-à-dire la négation) au résultat de l'invocation de l'expression de fonction.C'est une autre façon d'écrire IIFE (expression de fonction immédiatement invoquée).
Son autre façon d'écrire -
pareil que
la source
(function (args) {...})()
syntaxe plus explicite et laisserais cette!function
forme aux outils de minification et d'obscurcissement.!
annulera (en face) tout ce que vous attendez en conséquence, c'est-à-dire si vous avezlorsque vous appelez
boy
, votre résultat seratrue
, mais au moment où vous ajoutez le!
lors de l'appelboy
, c'est!boy
-à- dire , votre résultat serafalse
. En d'autres termes, vous voulez dire NotBoy , mais cette fois, c'est essentiellement un résultat booléen, soittrue
oufalse
.C'est la même chose qui arrive à l'
!function () {}();
expression, exécuter uniquementfunction () {}();
vous signalera une erreur, mais ajouter!
juste en face de votrefunction () {}();
expression, en fait l'opposé de cefunction () {}();
qui devrait vous renvoyertrue
. Un exemple peut être vu ci-dessous:la source