Passer au contenu principal
eLearner.app
Module 4 · Leçon 4 sur 416/32 dans le cours~12 min
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 :

JS
const moltiplicatore = 10;

function moltiplicaPer10(n) {
  return n * moltiplicatore; // legge dalla closure
}

moltiplicaPer10(3); // 30

Usine à fonctions (Factory)

Le motif (pattern) le plus classique : une fonction qui renvoie une autre fonction, "personnalisée" avec les paramètres reçus.

JS
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.

JS
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

Exercice#js.m4.l4.e1
Tentatives : 0Chargement…

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.

Chargement de l'éditeur…
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

Exercice#js.m4.l4.e2
Tentatives : 0Chargement…

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.

Chargement de l'éditeur…
Afficher l'indice

Renvoie une fonction fléchée qui utilise base du paramètre externe.

Solution disponible après 3 tentatives