Callbacks et foncteurs en javascript

mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 - 30 mai 2022 à 00:48

Callback

Définition

Une callback est une fonction passée en paramètre d'une autre fonction.

Avantage

Une callback sert à factoriser du code.

Par exemple, "trier une liste du plus petit au plus grand élément" et "trier une liste du plus grand au plus petit élément", sont deux problèmes similaires : on change juste la relation d'ordre
<
par
>
. Il suffit donc d'implémenter une seule fonction de tri prenant en paramètre cette relation d'ordre pour traiter les deux problèmes avec le même code.

Exemple

Dans l'exemple qui suit,
compute
attend une callback
f
et deux valeurs
a
et
b
.

function add(a, b) { return a + b; }
function mult(a, b) { return a * b; }
    
function compute(f, a, b) {
    r = f(a, b);
    document.write(r);
}

compute(add, 3, 5);  // Displays 8
compute(mult, 4, 7); // Displays 28

Foncteur

Définition

Un foncteur est un objet qui possède un constructeur et une fonction permettant de l'appeler au même titre qu'une fonction. C'est donc une généralisation directe de la callback (qui n'a pas de notion de constructeur). En mathématiques, cela correspond à la notion de fonction paramétrée :
  • Le paramètre de la fonction correspond à ce qui est passé à la construction du foncteur (cela correspond à la méthode
    __init__
    en python).
  • Le foncteur est ensuite passé en argument à l'algorithme au même titre qu'une callback ordinaire (cela correspond à la méthode
    __call__
    en python).

Avantage

Contrairement à une callback, le foncteur est paramétrable lors de son initialisation.

Principe

En javascript :
  • un objet se déclare comme une fonction. Les paramètres de la fonctions correspondent au paramètres du constructeur en C++ ou de
    __init__
    en python ;
  • un foncteur se réalise en s'appuyant sur la notion de closure.

Exemple

Dans cet exemple, la fonction
compute
prend en paramètre une fonction à deux arguments
a
et
b
.

function compute(f, a, b) {
    y = f(a, b);
    document.write(y);
}


On souhaite à présent qu'au moment d'écrire
y
, celui-ci soit précédé par
l
et suivi par
r
sans modifier le code de
compute
.

Pour cela, on définit un foncteur
Add
dont le constructeur prendra en argument
l
(valant
"<"
) et
r
(valant
">"
).On nomme
add
l'instance du foncteur que l'on crée.

function Add(l, r) {      /* Like __init__ */
    return function(a, b) {   /* Like __call__ */
        return l + (a + b) + r;
    }
}

add = Add("<", ">");


On peut désormais appeler
compute
et lui passer
add
en paramètre. Les valeurs de
a
et
b
sont reçues en argument par
compute
qui lui-même appelle le foncteur
add
. Le foncteur exécute à son tour la fonction qu'il enveloppe.

compute(add, 3, 5); // Displays <8>
compute(add, 4, 7); // Displays <28>

Foncteurs et autres langages

En C++ ou python, un foncteur se réalise en déclarant un objet.
  • En C++, cet objet implémente
    operator()
    .
  • En python, il implémente la méthode
    __call__
    .