Maison >interface Web >js tutoriel >Comprendre les fermetures en JavaScript : de la confusion à la clarté

Comprendre les fermetures en JavaScript : de la confusion à la clarté

Linda Hamilton
Linda Hamiltonoriginal
2024-11-24 08:06:10287parcourir

Understanding Closures in JavaScript: From Confusion to Clarity

Imaginez ceci...

Vous travaillez sur un projet et vous avez besoin d'une fonction pour « mémoriser » les valeurs des variables, même une fois l'exécution de la fonction terminée. Les fermetures sont comme un sac à dos magique qui vous permet de transporter les connaissances d'une leçon précédente partout où vous allez dans votre code. C’est l’un des concepts JavaScript les plus puissants mais les plus mal compris. Mais ne vous inquiétez pas : à la fin de ce guide, les fermetures passeront du stade de casse-tête à « aha ! »


Qu’est-ce qu’une fermeture ? Définition simplifiée et analogie

Une fermeture se produit lorsqu'une fonction "se souvient" de son état environnant (les variables dans sa portée) même après que la fonction externe a fini de s'exécuter. Décomposons cela avec une analogie pertinente :

Analogie avec la vie réelle : le sac à dos de la connaissance

Imaginez que vous êtes étudiant. Vous avez un sac à dos avec vos notes, stylos et livres. Vous quittez la salle de classe (votre fonction extérieure), mais vous avez toujours accès à tout ce qui se trouve dans votre sac à dos (votre fermeture). Chaque fois que vous aurez besoin de résoudre un problème plus tard, vous pourrez récupérer les connaissances que vous avez enregistrées dans votre sac à dos.

Définition simplifiée

En JavaScript, les fermetures se produisent lorsque :

  1. Une fonction est définie à l'intérieur d'une autre fonction.
  2. La fonction interne "se souvient" des variables de la fonction externe.

Comment fonctionnent les fermetures ? Exemples en action

Voyons les fermetures en action avec des exemples de code.

Exemple 1 : une clôture de base

function outerFunction() {
  const outerVariable = 'Hello, Closure!';

  function innerFunction() {
    console.log(outerVariable);
  }

  return innerFunction;
}

const myClosure = outerFunction();
myClosure(); // Output: "Hello, Closure!"

Que se passe-t-il ici ?

  • innerFunction est renvoyé par externalFunction.
  • Même si externalFunction a fini de s'exécuter, innerFunction se souvient toujours de externalVariable.

Exemple 2 : Clôture d'un guichet

function createCounter() {
  let count = 0;

  return function () {
    count++;
    return count;
  };
}

const counter = createCounter();
console.log(counter()); // Output: 1
console.log(counter()); // Output: 2

Que se passe-t-il ici ?

  • La fonction renvoyée "se souvient" de la variable count, même si createCounter a fini de s'exécuter.
  • Chaque fois que vous appelez le compteur, il se met à jour et mémorise la dernière valeur du compteur.

Exemple 3 : Fermetures en boucles (piège courant)

Les fermetures font souvent trébucher les développeurs lorsqu'elles sont utilisées dans des boucles.

for (let i = 1; i <= 3; i++) {
  setTimeout(() => console.log(i), i * 1000);
}
// Output: 1, 2, 3 (each after 1 second)

Pourquoi cela fonctionne-t-il ?

  • Le mot-clé let crée une portée de bloc, donc chaque itération a son propre i.
  • Si vous utilisiez var au lieu de let, toutes les sorties seraient 4 car var ne crée pas de portée de bloc.

? Documentation : Fermetures sur MDN


Cas d'utilisation courants des fermetures

Les fermetures ne sont pas seulement un concept théorique : elles sont incroyablement pratiques ! Voici quelques scénarios courants dans lesquels les fermetures brillent.

1. Mise en cache des données

Les fermetures peuvent stocker des valeurs calculées pour les réutiliser, économisant ainsi du temps et des ressources.

function outerFunction() {
  const outerVariable = 'Hello, Closure!';

  function innerFunction() {
    console.log(outerVariable);
  }

  return innerFunction;
}

const myClosure = outerFunction();
myClosure(); // Output: "Hello, Closure!"

2. Gestionnaires d'événements

Les fermetures sont souvent utilisées dans les écouteurs d'événements pour maintenir l'état.

function createCounter() {
  let count = 0;

  return function () {
    count++;
    return count;
  };
}

const counter = createCounter();
console.log(counter()); // Output: 1
console.log(counter()); // Output: 2

3. Variables privées

Vous pouvez utiliser des fermetures pour créer des variables privées, encapsulant des fonctionnalités.

for (let i = 1; i <= 3; i++) {
  setTimeout(() => console.log(i), i * 1000);
}
// Output: 1, 2, 3 (each after 1 second)

Pourquoi les fermetures sont puissantes

Les fermetures permettent de :

  • Conserver l'état : mémoriser les variables même après la fin de l'exécution d'une fonction.
  • Fonctionnalité d'encapsulation : gardez les variables privées et sécurisées.
  • Simplifiez le code : évitez les variables globales en utilisant des fermetures pour la gestion des états.

Conclusion : mettez-vous au défi d'utiliser les fermetures

Les fermetures sont comme un couteau suisse en JavaScript. Que vous mettiez en cache des données, gériez des événements ou créiez des variables privées, les fermetures vous offrent un moyen puissant de gérer l'état de vos applications.

Votre défi : essayez d'utiliser des fermetures dans un petit projet, comme construire un simple compteur ou créer un mécanisme de mise en cache. Vous serez étonné de voir à quel point les fermetures de contrôle vous offrent !


Si vous avez apprécié cet article, pensez à soutenir mon travail :

  • Achete-moi un café
  • Réservez un appel pour du mentorat ou des conseils de carrière
  • Suivez-moi sur Twitter
  • Connectez-vous sur LinkedIn

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn