Leçons du module (4/4)
Fermetures et portée
Une closure (fermeture) est une fonction qui "se souvient" des variables de la portée (scope) dans laquelle elle a été définie, même après la fin de cette portée. Cela semble magique, mais c'est une conséquence directe des règles de portée.
Portées en chaîne (Scope chain)
Une fonction peut lire des variables déclarées en dehors d'elle-même, en remontant la chaîne des portées :
const moltiplicatore = 10;
function moltiplicaPer10(n) {
return n * moltiplicatore; // legge dalla closure
}
moltiplicaPer10(3); // 30Usine à fonctions (Factory)
Le motif (pattern) le plus classique : une fonction qui renvoie une autre fonction, "personnalisée" avec les paramètres reçus.
function creaSaluto(prefisso) {
return function (nome) {
return `${prefisso}, ${nome}!`;
};
}
const ciao = creaSaluto('Ciao');
const buongiorno = creaSaluto('Buongiorno');
ciao('Anna'); // 'Ciao, Anna!'
buongiorno('Marco'); // 'Buongiorno, Marco!'Chaque appel à creaSaluto crée une portée distincte, avec son propre prefisso.
Compteur avec état privé
L'exemple classique : une closure qui maintient un compteur sans l'exposer à l'extérieur.
function creaContatore() {
let n = 0;
return function () {
n++;
return n;
};
}
const c = creaContatore();
c(); // 1
c(); // 2
c(); // 3
const c2 = creaContatore();
c2(); // 1 ← stato isolato!n est privé : personne en dehors de la closure ne peut le lire ou le modifier.
À toi de jouer
Implémente une fabrique `makeCounter()` qui renvoie une fonction : chaque appel de cette fonction renvoie un entier progressif en commençant par 1. Différents compteurs doivent être indépendants.
Afficher l'indice
Déclare n avec let dans makeCounter, puis renvoie une fonction qui fait ++n.
Solution disponible après 3 tentatives
Exercice de révision
Implémente `makeAdderWith(base)` qui renvoie une fonction : étant donné un nombre n, elle renvoie base + n. Chaque additionneur se souvient de sa propre base.
Afficher l'indice
Renvoie une fonction fléchée qui utilise base du paramètre externe.
Solution disponible après 3 tentatives