Syntaxe Javascript: Expression de fonction immédiatement appelée (IIFE) avec des paramètres

J'ai toujours vu un code comme celui-ci:

(function(){ //code here })(); 

Comment fonctionne ce code? Quelle fonction reçoit les paramètres?

 (function(factory){ //code here }(function($){ //other code here })); 

 function($){ //other code here } 

Ce bloc est transmis en tant que paramètre à l'IIFE externe. Il pourrait être plus clair de l'écrire comme ceci:

 var factoryDef = function($) { ... }; (function(factory) { // this is the outer IIFE var someVar = {}; // you can call: factory(someVar); // the previous line calls factoryDef with param someVar }(factoryDef)); 

Donc factory(someVar) est identique à factoryDef({}) ; Ce dernier est simplement la valeur de factory (qui est la fonction factoryDef ) appelée avec la valeur de someVar (qui est {} .)

Cela a-t-il du sens?

Disons:

Une autre façon de regarder ceci est:

  1. Commence avec une déclaration de fonction anonyme assignant dans la fonction, le premier paramètre à passer, le nom de la variable "usine"

  2. Ensuite, la fonction anonyme est immédiatement invoquée, jusqu'à présent bien, souvent appelée IIFE (ou, dans ce cas, DC appelle «boules de chien»)).

  3. Voici une torsion, dans le cadre de l'appel immédiat de la fonction externe, une autre fonction anonyme est déclarée et passée comme argument. Ceci, bien sûr, est appelé "usine" dans la fonction externe. Et,

  4. Cette fonction anonyme à l'intérieur de la famille a comme paramètre nommé "$". Donc, je dois anticiper la fonction la plus externe, lorsque j'appelle "usine", la fonction la plus interne, passera quelque chose qui sera appelé "$" dans la fonction la plus interne. Par exemple: factory(jQuery); .

En fait, lors de la lecture du code, je pense qu'il est préférable de commencer à la fin et à l'intérieur. Alors, la première chose que je regarde, c'est la fonction avec le "$". On dirait une déclaration de fonction anonyme. Et il se trouve que l'exécution d'une fonction est instanciée. Déplacement et départ maintenant. La fonction qui est immédiatement exécutée est également une fonction anonyme, pas un problème, car elle n'est appelée qu'une seule fois et son exécution est construite. Et notre fonction anonyme, la plus anonyme, est un nom dans la déclaration de fonction la plus externe. Finalement, l'enveloppement total entre parenthèses est nécessaire pour mettre la fonction anonyme dans un contexte d'expression. Si la première chose sur la ligne est le mot "fonction" alors la fonction est dans le contexte de la déclaration et l'analyseur Javascript ne permet pas qu'elle soit immédiatement invoquée. Oops.

Encore plus tendu ressemble à:

 var innerMost = function($) { console.log($); }; var outerMost = function(factory) { var kaChing = 'baLing'; factory(kaChing); }; outerMost(innerMost); 

Voilà!

.

Fiddle avec ceci: http://jsfiddle.net/xFnP7/1/

Beaucoup plus ici: http://benalman.com/news/2010/11/immediately-invoked-function-expression/