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 fonctionnom
On 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 variable
La 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_1
counter_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