Fonction anonyme vs fonction nommée séparée pour l'initialisation dans jquery

9

Disons que nous avons du code qui est utilisé pour initialiser les choses lorsqu'une page est chargée et cela ressemble à ceci:

function initStuff() { ...}
...
$(document).ready(initStuff);

La fonction initStuff n'est appelée qu'à partir de la troisième ligne de l'extrait de code. Plus jamais. Donc, généralement, les gens mettent cela dans un rappel anonyme comme celui-ci:

$(document).ready(function() { 
    //Body of initStuff
});

Avoir la fonction dans un emplacement dédié dans le code n'aide pas vraiment à la lisibilité, car avec l'appel à ready (), il est évident que c'est du code d'initialisation.

Y a-t-il d'autres raisons de préférer l'une à l'autre?

Martin N.
la source
4
Le premier encombre l'espace de noms global. Choisissez la seconde.
riwalk

Réponses:

10

Comme @ Stargazer712 l'a mentionné, le premier encombre l'espace de noms mondial, donc le second est le gagnant à mon humble avis. Maintenant, cela étant dit, parce que vous utilisez une fonction anonyme dans le deuxième exemple, la pile d'appels de votre débogueur sera inutile et obtiendra des résultats différents selon le débogueur que vous utilisez. Habituellement, ce que je finis par faire, c'est:

$(document).ready(function MODULE_init() { 
    //Body of initStuff
});

De cette façon, l'espace de noms global n'est pas encombré et vous disposez d'une pile d'appels utile.

J'ai tendance à utiliser la convention ci-dessus dans toutes les définitions de fonctions anonymes (enfin, plus anonymes;)). C'est une convention que j'ai trouvée lors de la navigation dans le code Firefox JS.

Edit: Maintenant, après avoir dit tout cela, Oliver soulève un bon point avec des tests unitaires. Ce qui précède est censé agir comme un wrapper pour des opérations plus complexes, pas pour héberger une tonne de code non testé.

Demian Brecht
la source
+1 Pour avoir mentionné le débogage. J'ai souvent vu l'utilisation de "rappels nommés" (je ne sais pas si ce terme existe réellement) dans le code Node.js, donc je suppose aussi que c'est une bonne pratique.
Oliver Weiler
kangax.github.com/nfe Expressions de fonctions nommées - Cet article vous explique tout ce que vous avez toujours voulu savoir à leur sujet.
Sean McMillan
7

Je dirais que dans ce cas, cela n'a probablement pas d'importance, mais si vous avez des fonctions de rappel anonyme, appelant d'autres fonctions de rappel anonyme, j'ai tendance à utiliser la première approche, car cela rend le code beaucoup plus lisible et plus facile à suivre.

En ce qui concerne les tests unitaires, la première approche serait meilleure, car vous seriez en mesure de tester la initstufffonction de manière isolée.

Oliver Weiler
la source
Habituellement, nous n'avons pas beaucoup de code dans ces fonctions d'initialisation. Il peut récupérer des données à partir de quelques endroits et c'est tout
Martin N.
3

J'irais pour le premier, pour la lisibilité / débogage / test, etc. Vous pouvez éviter le problème d'encombrement global de l'espace de noms en créant simplement un espace de noms local pour toutes les fonctions de votre page. J'utilise le style de notation d'objet, comme recommandé par Paul Irish (voir les diapositives 13-15 sur http://paulirish.com/2009/perf/ )

var MYPAGE = {
  onReady : function(){
  // init code
  },
  someOtherCallback : function(){}
};

jQuery(document).ready(MYPAGE.onReady);
njaggars
la source
2

Il y a aussi une troisième façon d'enregistrer les méthodes init sans encombrer l'espace de noms global que je préfère:

jQuery(function(){....});

C'est court et évite la recherche de documents DOM comme

jQuery(document).ready(function(){...}); 

Est-ce que.

Alex
la source
+1: Je pense que c'est une pratique standard, mais pour éviter tout problème avec les définitions contradictoires de $je préfère:jQuery(function($) {...});
kevin cline