Idiom JavaScript: créer une fonction uniquement pour l’invoquer

J’apprends YUI et j’ai parfois vu cette expression:

 (function x(){ do abcxyz})();  

Pourquoi créent-ils une fonction juste pour l’invoquer? Pourquoi ne pas simplement écrire:

  do abcxyz  

Par exemple voir ici .

Ils profitent des fermetures .

Une brève explication: JS utilisant l’étendue au niveau de la fonction, vous pouvez effectuer un grand nombre d’actions au sein d’une fonction et la laisser restr dans cette étendue. Ceci est utile pour appeler du code qui ne dérange pas avec l’espace de noms global. Cela permet également de créer des variables privées – si vous déclarez une variable à l’intérieur d’une fonction anonyme et l’exécutez immédiatement, seul le code situé à l’intérieur de la fonction anonyme peut accéder à cette variable.

Par exemple, supposons que je veuille créer un générateur d’identifiant unique global. On pourrait faire un code comme ceci:

 var counter = 0; var genId = function() { counter = counter + 1; return counter; } 

Cependant, maintenant tout le monde peut jouer avec counter et j’ai pollué l’espace de noms global avec deux variables ( counter et genId ).

Au lieu de cela, je pourrais utiliser une fonction anonyme pour générer ma fonction de compteur:

 var genId = function() { var counter = 0; var genIdImpl = function() { counter = counter + 1; return counter; } return genIdImpl; }(); 

Maintenant, je n’ai qu’une variable dans l’espace de noms global, ce qui est avantageux. Plus important encore, la variable compteur est maintenant protégée contre toute modification. Elle n’existe que dans l’étendue de la fonction anonyme et seule la fonction genIdImpl (définie dans la même étendue) peut y accéder.

Il semble que dans l’exemple de code de YUI, ils souhaitent simplement exécuter du code qui ne pollue pas du tout l’espace de noms global.

Ils veulent éviter les collisions entre les espaces de noms, je suppose. Cela semble être une bonne pratique en JS.