I. La clôture jQuery▲
I-A. Introduction▲
Non, il ne s'agit pas de clôturer le compte bancaire de jQuery ! Il s'agit simplement de protéger votre code.
En anglais on parle de « closure » et ce mot peut se traduire par fermeture, mais aussi par clôture que je trouve plus parlant.
I-B. C'est quoi ?▲
Il s'agit d'une fonction anonyme function(){…}
entourée d'une clôture (function(){…})();
et dédiée à jQuery : (function($){…})(jQuery);
I-C. Un espace privé▲
La clôture (function(){…})(); est un espace privé. Elle s'exécutera automatiquement.
La clôture jQuery (function($){…})(jQuery); est un espace privé, dans lequel le symbole $ est clairement et exclusivement attribué à jQuery. Elle s'exécutera automatiquement.
I-D. Plus de conflits pour le $▲
Si vous utilisez une autre bibliothèque (« framework »), la clôture vous assure qu'il n'y aura pas de conflit pour la maîtrise du symbole $.
(function($){
//jQuery
$("#conteneur").css("backgroundColor","#FFCC66");
})(jQuery);
//Prototype
$('affiche').addClassName('active').show();
//jQuery
//erreur : $("#conteneur") is null !
$("#conteneur").css("color","red");I-E. Objets, fonctions et variables locales▲
Tout ce qui est déclaré à l'intérieur de la clôture est inconnu en dehors à la seule condition que vous utilisiez le mot clé « var » comme il se doit.
(1) L'utilisation de l'espace de noms de l'objet global « window » par votre code est source d'inexactitude, d'instabilité et d'insécurité.
Ce qui était tolérable à l'époque de scripts de quelques lignes est rigoureusement à proscrire à l'époque du « web 2.0 » où nous mélangeons des centaines de lignes de scripts d'auteurs différents. Le risque de collisions dans l'espace de noms de l'objet global « window » devient une certitude.
La qualité de votre code est inversement proportionnelle aux nombres d'objets, de fonctions et de variables que vous avez introduits dans l'espace de noms de l'objet global « window ».
Idéalement votre code ne doit dépendre que d'un seul objet global.
I-F. L'opérateur this▲
Dès la clôture créée, le mot clé « this » représentant l'objet « window » sera disponible tant que vous ne modifierez pas sa valeur.
(2) Je cite2 :
« Le mot-clé this fait référence à l'objet de contexte (ou objet courant). En général, dans une méthode, this fait référence à l'objet appelant. »
« Du fait du « passage » de this aux fonctions, this n'a pas de valeur fixe pour une fonction. Cela signifie qu'une fonction n'a pas de « propriétaire » ou de « parent », même s'il s'agit d'une méthode. En d'autres mots, une méthode n'est pas liée à l'objet dont elle est une méthode. »
« La distinction entre méthodes et fonctions se fait uniquement au moment de l'appel : les appels de méthode passent l'« objet parent » comme valeur de this, tandis que les appels de fonctions passent l'objet global en tant que this. »
Fin de la citation2.
(function($){
//équivalent à window.confirm()
var r = this.confirm("Bienvenue dans mon cahier d'exercices sur jQuery & Co.");
if (r == true){
//équivalent à window.alert()
this.alert("You pressed OK!")
} else {
this.alert("You pressed Cancel!")
}
//Une fonction anonyme entourée d'une clôture. Elle s'exécutera automatiquement.
(function(){
this.alert("La valeur de this n'ayant pas été modifiée, sa valeur est : " + this);
})();
//https://james.padolsey.com/javascript/jquery-delay-plugin/
$.fn.delay = function(time, callback){
jQuery.fx.step.delay = function(){};
return this.animate({delay:1}, time, callback);
}
//On peut conserver la valeur actuelle de this en l'affectant à une variable, par exemple that
var that = this;
//équivalent à $(window).ready()
$(this).ready(function(){
alert("Dans $(window).ready(), that = " + that + ", et this = " + this);
$("#conteneur h1").delay(2000, function(){
$(this).css("color","#339900");
alert("Dans cette fonction anonyme, that = " + that + ", et this = " + this);
});
});
})(jQuery);Avec Internet Explorer 8 vous devrez actualiser la page pour obtenir l'affichage de toutes les boites de dialogues.
Avec Firefox, voici le contenu des trois dernières boites de dialogue :
- La valeur de this n'ayant pas été modifiée, sa valeur est : [object Window] ;
- Dans $(window).ready(), that = [object Window], et this = [object HTMLDocument] ;
- Dans cette fonction anonyme, that = [object Window], et this = [object HTMLHeadingElement].
I-G. Mais alors, comment ?▲
Je vous entends : « Si j'adopte son système, si je clôture tous mes programmes, comment appeler mon code ? »
Il faut conserver, au niveau global, un point d'entrée qui sera un objet ou une fonction. Mais pas n'importe comment.


