|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
![]() ![]() ![]() Didier MouronvalDéveloppeur Web Inscription : juin 2008 Messages : 13 807 ![]() |
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 :
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 : Code :
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 : Code :
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 : Code :
Billet original publié sur les blogs de developpez.com... Billet original
__________________
Pas de question technique par MP ! Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi ! Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi ! Mes formations video2brain : La formation complète sur JavaScript • JavaScript et le DOM par la pratique • PHP 5 et MySQL : les fondamentaux Mon livre sur jQuery
|
||||||
|
40
|
|
|
#2 | |||
|
Membre confirmé
![]() ![]() Lionel ChaumeauDéveloppeur Web Inscription : octobre 2011 Messages : 75 ![]() |
Citation:
pour le code en question: une première approche de la closure nan ? Vous serait-il possible de développer ce sujet dans le futur ? Je croise souvent ce concept en programmation "objets" en javascript et j'ai vraiment du mal à le saisir (le principe comme les avantages m'échappent encore beaucoup)... 1 merci pour ce billet (et 1000 si vous trouvez un des ces 4 le temps de nous éclairer sur la closure...
__________________
My laptop, my bike and my double-sticks... |
|||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com