Arguments.Callee

Cette fonction est en fait dépréciée dans la 5ème version d’ECMAScript. Je laisse l’article quand même, mais soyez en conscient. (Merci à Atinux)

Aujourd’hui, j’ai eu le plaisir de tomber par hasard grâce au site VanillaJS sur un bout de code en JavaScript dont je ne connaissais pas la signification. Le voici : arguments.callee. Il est utilisé dans une fonction. Quand on cherche à savoir les arguments passés en paramètres à une fonction, on fait appel à arguments. Cependant, je n’avais jamais vu de callee, cela restait un mystère.

Après un court instant de recherche sur MDN, j’ai enfin compris que arguments.callee fait tout simplement référence à la fonction qui est exécutée. Et ce, même si la fonction est anonyme ou non.

Le fadeOut

Cela m’aurait bien été utile quelques mois auparavant, lorsque j’essayais de faire un effet de fadeOut à la jQuery en pur JS. Je voulais qu’une fonction anonyme se rappelle elle même. Pour cela, je comptais utiliser la fonction setTimeout(nomDeLaFontion, tempsEntreChaqueIntervalle). Mais comment faire, étant donné que la fonction anonyme n’a pas de nom, elle ne peux être appelée ?

C’est ici qu’intervient arguments.callee, je pouvais maintenant utilser setTimeout sans me soucier du nom de cette fonction. Voici le code que j’ai écris :

JS

// Je récupère l'objet que je veux faire disparaître
var obj = document.getElementById('maChoseAFaireDisparaitre').style;
obj.opacity = 1;

// Je lance une fonction anonyme directement
(function(){
    if(obj.opacity >= -1){
        obj.opacity -= .11;
        // On rappelle la fonction qui est exécutée tous les 1/40 secondes
        setTimeout(arguments.callee, 40);
    }else{
        obj.display = "none";
    }
})();

Ce code fait baisser l’opacité de mon objet tant qu’il a une opacité positive.

Compatibilité et Performance

Callee est disponible depuis ECMAScript 3ème Edition, et est donc supporté aussi par IE7, donc ça c’est vraiment bien !

Le gain de performance est intéressant car comparé à jQuery, on est à 92% plus lent avec du jQuery. Pour une fonction que l’on pourra réutiliser plus tard dans sa propre bibliothèque, et pour éviter de toujours utiliser jQuery pour les petites tâches, cela me semble pas mal. (Allez voir le JSPerf)