11540 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous,

J'aimerais votre avis sur un truc que j'ai lu et vu à plusieurs reprises et pour lequel je ne suis pas (au moins en partie) d'accord. Donc vos avis m'aiderons, je l'espère, à mieux comprendre et accepter ceci.

Quand, dans une fonction jQuery on utilise le this pour faire référence à l'objet appelé, il est conseillé deux choses :
1/ de l'attribuer à une variable, qu'on utilisera à chaque fois par la suite à la place du $(this)
2/ c'est mieux car on sait qui on appel.

Pour le coup, je suis largement dans le doute sur une histoire de performances (en Java c'est sûr qu'il n'y a aucune différences car c'est la JVM qui fait sa sauce. Si elle repère trop de this, elle peut d'elle-même décider de l'attribuer à une variable, si et seulement si de meilleures performances seront possibles). Pour JavaScript et jQuery, j'irais dans le même sens que Java mais je ne sais pas comment les navigateurs le prennent en charge.

Pour le coup de la lisibilité, là je ne suis carrément pas d'accord avec ça. Si la fonction ne fais que quelques lignes avec 2-3 variables, ok. Par contre quand on commence à partir sur plusieurs lignes et pleins de variables, je ne partage pas cet avis car en plus des variables nécessaires, il faut en plus repérer celle qui est le this. Ok, on peut y donner un nom clair, etc. Mais bon, je trouve que le plus simple est de laisser this, je vois pas en quoi c'est plus simple d'englober ça dans une variable.

Voilà, maintenant je vous laisse la parole et merci d'avances pour vos avis.
Modifié par MagicCarpet (13 Jan 2013 - 15:22)
Salut,

Ce ne sont pas les appels à this qui coutent cher. C'est l'appel à $(). $() est une fonction qui fait des traitements et crée un objet. Re-créer le même objet plusieurs fois est donc inutilement couteux.

Quant à la lisibilité, on se perd vite si on a plusieurs "callback" imbriqués (et donc que le 'this' change de signification à chaque imbrication). De même, sauvegarder this à un niveau N permet d'avoir accès à sa valeur au niveau N+1.

Personnellement, dans tout callback appelé par jQuery (que ce soit par un événement, un .each() ou autre), si j'ai besoin de wrapper l'objet this dans un objet jQuery, je fais ceci:
var $this = $(this);
Dans la suite, j'utilise donc $this au lieu de $(this).

Et d'une manière générale, quand une variable représente un objet jQuery, je commence son nom par $. Ca rend le code plus lisible car on sait directement de quel type de variable il s'agit. Exemple:
var $p1 = $("#p1");
Ok merci pour ta réponse rapide et complète jiber2fr, je comprends et du coup je vais de ce pas modifier mon code. Excellent, merci encore ! Smiley smile

EDIT : J'avais pas du tout pensais aux callback par contre...
Modifié par MagicCarpet (13 Jan 2013 - 11:51)