Programmation fonctionnelle en JavaScript
Romuald THION
Semestre pair 2022 UNC
JavaScript is a multi-paradigm, dynamic language with types and operators, standard built-in objects, and methods. […] JavaScript also supports functional programming — because they are objects, functions may be stored in variables and passed around like any other object.
2021 Developer Survey Stack Overflow Top paying technologies
Functional programming is finally going mainstream
Glossary of Modern JavaScript Concepts (2017)
La programmation fonctionnelle (functional) c’est un peu tout ça
Qu’est ce qui fait (en partie) le caractère “fonctionnel” ?
En JavaScript (et en Python) les fonctions sont des objets comme les autres.
Les fonctions sont essentiellement des objets avec une méthode particulière call (__call__ en Python)
function funct(arg1, arg2, ..., argN) {
// instructions
return expression;
}
const res = funct(p1, p2, ..., pN);Ici, on crée (déclare) une fonction avec une instruction (statement en anglais, qui n’a pas de valeur de retour). MDN
const funct = function (arg1, arg2, ..., argN) {
// instructions
return expression;
};
const res = funct(p1, p2, ..., pN);Ici, on crée une fonction comme une expression que l’on affecte à une variable, on appelle cette expression une Named Function Expression (NFE). MDN
Dite aussi : arrow function expression, fat arrows, lambda ou \(\lambda\). MDN
Quasi-équivalente à la NFE suivante :
let sum = (a, b) => {
// accolade pour avoir plusieurs lignes
const result = a + b;
// avec les accolades, l'instruction return est OBLIGATOIRE
return result;
};
console.log(sum(1, 2));Variante multi-lignes, attention au return final.
Attention : une arrow n’a pas de this propre, voir Arrow functions, the basics et Arrow functions revisited.
Vous aurez le problème avec les arrows si vous utilisez this dans un handler.
(il n’y a pas non plus de variable arguments et on ne peut pas instancier avec new, mais de toute façon, les deux sont à éviter.)
On reprend l’exercice 2 affichage d’images du TP JS2 mais avec une variante :
<div id="image-container">.Créer des fonctions avec d’autres fonctions, valable pour les trois types de créations (instruction, expression, arrow)
Que fait le code précédent ?
nom"Mozilla"Éléments remarquables de creerFonction()
creerFonction() renvoie une fonctionnomOn dit que maFonction() est une fermeture (closure)
function sayHello(person) {
return function (str) {
console.log("Hi " + person + ", " + str);
};
}
let helloBuddy = sayHello("Buddy");
let helloGuys = sayHello("Guys");
helloBuddy("c'mon");
helloGuys("how do you do?");La variable person a une valeur dans helloBuddy et une autre dans helloGuys : l’environnement lexical a été capturé.
function fabriqueRedimensionneur(taille) {
return function () {
document.body.style.fontSize = taille + "px";
};
}
let taille12 = fabriqueRedimensionneur(12);
let taille14 = fabriqueRedimensionneur(14);
document.getElementById("t-12").onclick = taille12;
document.getElementById("t-14").onclick = taille14;Pour les déclarations let et const on une portée bloc délimitée par des accolades {...} :
{
let message = "Hello";
console.log(message);
}
{
// pas d'erreur, chaque variable dans son bloc
let message = "Goodbye";
console.log(message);
}Pour var c’est faux, mais de toute façon var c’est terminé.
for (let i = 0; i < 3; i++) {
console.log(i); // 0, then 1, then 2
}
console.log(i); // Error, no such variableLa portée de i est limitée à la boucle for car déclarée avec let (est faux avec var !)
Question qu’est ce qui s’affiche ?
A closure is a function that remembers its outer variables and can access them javascript.info.
count est dans l’environnement extérieur de la fonction counter_1counter_1 et counter_2 a son propre environnementUn exemple similaire en Python, en utilisant le module d’introspection inspect
An IIFE (Immediately Invoked Function Expression) is a JavaScript function that runs as soon as it is defined MDN.
Pourquoi faire ceci ?
Ensuite, faire les 6 premiers exercices (jusqu’à sum with closure) de javascript.info.
counter qui renvoie une fonction, disons f, qui renvoie son paramètre n élevé au carré mais en comptant et affichant le nombre d’appels fait à f à chaque utilisation.counter.Remarque les globaux sont interdits (dans cet exercice, et en général).
Remarque faites avec/sans fermeture