Une fonction définie à l’intérieur d’une autre n’oublie pas, une fois celle-ci terminée, les variables auxquelles elle avait accès pendant sa création : elle continue d’y « voir clair » comme si l’environnement d’origine était toujours actif. C’est cette capacité, à première vue contre-intuitive, qui porte le nom de fermeture (closure) : la fonction interne emporte avec elle un accès durable à son contexte de naissance.
Un usage discret mais fréquent dans WordPress
Les fermetures sont partout dans le JavaScript des blocs WordPress sans qu’on les nomme forcément : chaque gestionnaire d’événement défini à l’intérieur d’un composant React garde accès aux props et à l’état du composant qui l’entoure, précisément grâce à ce mécanisme. Elles servent aussi classiquement à créer des compteurs privés ou des configurations figées, sans exposer de variable globale qui pourrait être modifiée depuis n’importe où ailleurs sur la page.
Exemple
function creerCompteur() {
let total = 0;
return function() {
total++;
return total;
};
}
const compter = creerCompteur();
compter(); // 1
compter(); // 2 — "total" reste privé et persiste entre les appels
Pièges fréquents
- Créer une fermeture à l’intérieur d’une boucle avec
var(plutôt quelet) capture souvent la même variable partagée pour toutes les itérations, un bug classique de portée mal comprise. - Une fermeture qui retient une grande structure de données inutilement occupe cette mémoire tant que la fonction interne existe quelque part, un facteur de fuite mémoire dans un script de longue durée.
- Confondre fermeture et simple fonction imbriquée : toute fonction interne n’est une fermeture « intéressante » que si elle référence effectivement une variable de la fonction englobante.