novembre
2011
Il existe de nombreux cas en JavaScript qui nécessitent l’utilisation de fonctions de rappel (callback en anglais).
Une fonction de rappel est une fonction passée en paramètre d’une autre fonction. Pour JavaScript, c’est le cas par exemple de setTimeout(), setInterval() ou encore des fonctions appelées par un gestionnaire d’événement.
Cette notion de fonction de rappel est d’autant plus difficile à appréhender pour les débutants qu’il existe différentes façons distinctes de la définir, dont certaines erronées.
Les trois plus fréquentes sont les suivantes :
document.onclick = maFonction();document.onclick = "maFonction()";document.onclick = maFonction;
setTimeout(maFonction(), délai);setTimeout("maFonction()", délai);setTimeout(maFonction, délai);
Les exemples (1) sont tout simplement faux et ne produiront pas le résultat attendu. Ils sont un mélange entre les deux formes suivantes et dues à la confusion entre une fonction et le résultat de l’exécution de celle-ci.
Lorsque l’interpréteur JavaScript rencontre la notation maFonction() (donc avec les parenthèses), il comprend qu’il faut exécuter la fonction et le fait donc sur le champ. Or ce qu’attendent les méthodes nécessitant une fonction de rappel, c’est une référence à la fonction. Avec la notation des exemples (1), c’est le résultat de l’exécution qui sera affecté au clic ou au timer, sans attendre le moment souhaité par le développeur.
Les exemples (2) sont syntaxiquement corrects, mais fortement marqués d’obsolescence. En fait, dans ces cas ci, il n’y a pas de fonction de rappel de définie mais une portion de code qui sera évaluée au moment de l’appel. En interne, JavaScript va utiliser la méthode eval() pour interpréter le code, comme le montre l’exemple suivant :
alert('eval() is evil !');
}
function toto(){
alert('toto');
}
document.onclick = "toto()";
Dans cet exemple, c’est bien le message eval() is evil ! qui sera affiché. Cette façon de procéder, liée à la préhistoire de JavaScript, est fortement déconseillée !
Dans les exemples (3), c’est bien la référence à la fonction qui est utilisée De ce fait, lorsque le moment sera venu, cette fonction pourra être exécutée sans passer par l’utilisation de eval(), comme le montre l’exemple suivant :
alert('eval() is evil !');
}
function toto(){
alert('toto');
}
document.onclick = toto;
C’est bien le message toto qui est affiché lors du clic sur la page.
Note : si vous utilisez une console (par exemple celle de Firebug) pour tester les codes ci-dessus et que vous faites « Exécuter » deux fois de suite, vous obtiendrez le message eval() is evil, cela est dû au fait que l’injection du code dans le document utilise elle aussi des méthodes utilisant en interne eval() qui vient d’être redéfinie.
Mais alors, comment passer des paramètres à la fonction de rappel ?
Effectivement, le seul moyen de passer des paramètres à la fonction de rappel était celle des exemples (2), qui sont déconseillés.
Pour passer des paramètres, il va falloir utiliser une quatrième technique qui consiste à englober l’appel de la fonction de rappel dans une fonction anonyme. Cette fonction anonyme étant définie au moment de l’affectation, elle correspond donc à une référence à une fonction et non à une exécution de celle-ci :
alert('eval() is evil !');
}
function toto(texte){
alert(texte);
}
document.onclick = function(){
toto('Paramètre !');
};
Ce code affiche bien le paramètre passé à la fonction toto, elle-même englobée dans une fonction anonyme.
1 Commentaire + Ajouter un commentaire
Commentaires récents
- HTML5 : quelques nouveautés de l’API DOM pour JavaScript | CSS3 et HTML5 pratiques | Scoop.it dans HTML5 : quelques nouveautés de l’API DOM pour JavaScript
- transgohan dans HTML5 : quelques nouveautés de l’API DOM pour JavaScript
- BugBlaster dans Les fonctions de rappel (callback) ou les utilisations cachées de eval()
- bisûnûrs dans Personnalisez le menu contextuel avec Firefox
- bisûnûrs dans Comprendre la balise script
Archives
- août 2012
- avril 2012
- février 2012
- janvier 2012
- décembre 2011
- novembre 2011
- octobre 2011
- avril 2009
- mars 2009
- février 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
- avril 2007
- mars 2007
- novembre 2006



Un article de Bovino
Tu peux aussi mettre ton paramétre dans une closure.
function eval(){
alert(‘eval() is evil !’);
}
function toto(texte){
return function() { alert(texte); };
}
document.onclick = toto(‘Paramètre !’);
Have fun.
=========