48 votes

jQuery signe dollar ($) comme argument de fonction?

Je comprends les fermetures de JavaScript, et j'ai vu cela se faire en JS natif:

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

Mais que fait l’ajout de l’épice jQuery?

 (function ($) {
  // all JS code here
})(jQuery);
 

52voto

Sarfraz Points 168484

Quand vous voyez:

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

Il sait que l'auto-invocation de fonction anonyme. La fonction s'exécute dès que c'est analysée en raison de l'ajout d' () à la fin (c'est la façon dont vous exécutez js fonctions).

Avis supplémentaire externe accolades sont juste convention, vous pouvez aussi l'écrire comme:

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

Mais cette convention est largement utilisé à travers et vous devez vous en tenir à elle.

(function($) {
  // all JS code here
})(jQuery);

Ici, $ est mappé jQuery de l'objet, de sorte que vous pouvez utiliser $ au lieu de jQuery mot-clé. Vous pouvez aussi mettre un autre caractère là aussi:

(function(j) {
  // all JS code here
})(jQuery);

Ici, j est mappé jQuery objet à la place.

Notez également que les arguments spécifiés à l'auto-invocation de la fonction restent dans le champ d'application de cette fonction et n'entrent pas en conflit avec l'extérieur et la portée des variables.


J'avais écrit un article sur le sujet, s'il vous plaît vérifier:

36voto

David Mårtensson Points 4300

C'est un moyen de mapper jQuery au $ de manière à ce que tout le code d'une page ne le voie pas.

Vous avez peut-être un script existant qui utilise jQuery que vous souhaitez réutiliser, mais vous utilisez également un prototype qui utilise également $ dans la même page.

En encapsulant tout code jQuery utilisant du code dans cette construction, vous redéfinissez $ en jQuery pour la partie contenue sans entrer en conflit avec un autre code de la page.

17voto

Hawkeye Parker Points 605
(function() {
   // all JS code here
})();

Est un anonyme, auto-exécution de la fonction (ASEF).

(function(aParameter) {
   alert(aParameter);  // will alert "an argument"
})("an argument");

Voici un ASEF qui prend le paramètre 'aParameter" et passe lui-même l'argument "un argument".

(function($){
   alert($(window).jquery);  // alert the version of jQuery
})(jQuery);

Celui-ci est similaire, mais "jQuery" (L'objet jQuery exemple) est l'argument de l'ASEF, et dans ce cas, jQuery est transmis comme le '$' paramètre. De cette façon, simplement en tapant '$', le contenu/corps de l'ASEF ont accès à jQuery et de ses membres. C'est une commune jQuery convention, et il est commun pour les gens de l'écriture de plugins jQuery pour maintenir cette convention dans ce sens.

Non seulement le code ci-dessus maintenir le jQuery convention, il s'assure également que ni vous ni personne d'autre ne peut casser accidentellement cette convention. E. g., prenez le code suivant:

var $ = function() {
   alert('foo');
}

Ce code devient '$' dans quelque chose qui n'est certainement pas jQuery. Si quelqu'un l'a fait dans d'autres codes à l'extérieur de votre plugin code, et puis vous n'avez pas explicitement passer jQuery '$' pour votre plugin, alors vous ne pourrez pas utiliser '$' comme jQuery comme vous le faites habituellement.

12voto

Ben Blank Points 21786

Il y a deux raisons pour passer de jQuery dans une fermeture de cette façon.

De loin le plus important est que cela rend votre code sur les pages qui utilisent jQuery "pas de conflit" mode, ce qui permet l'utilisation de jQuery avec d'autres bibliothèques qui veulent contrôler l' $ mondiale. Pour cette raison, l' (function($) { ... })(jQuery) technique est fortement recommandé lors de l'écriture de plugins jQuery.

L'autre raison est qu'il rend $ d'une variable locale dans le champ d'application de l'auto-exécution de la fonction et de variable locale d'accès est (un peu) plus rapide que la variable globale d'accès. Personnellement, je ne considère pas cela d'un très convaincante - je ne peux pas imaginer un scénario dans lequel la surcharge de l'utilisation de jQuery plutôt que les méthodes du DOM pourrait être acceptable, mais celui de l'accès jQuery comme une variable globale ne serait pas. :-)

Je dirais que la meilleure raison d'utiliser cette technique lorsque pas l'écriture d'un plugin est pour des raisons de cohérence - vous êtes moins susceptibles d'oublier de le faire quand c' est important si vous avez l'habitude de le faire quand il n'est pas. En outre, vous ne savez jamais quand vous aurez l'occasion de recycler de code!

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