vendredi 25 septembre 2026

À propos

Contact

Lexique · JavaScript

Fermeture

En anglais : « Closure »

Fonction JavaScript qui garde en mémoire l'accès aux variables de son environnement d'origine, même après que la fonction englobante qui les a créées ait terminé son exécution.

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 que let) 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.