Les fermetures en JavaScript sont des fonctions qui ont accès à des variables dans leur portée lexicale extérieure (enfermante), même après le retour de la fonction extérieure. Cette fonction permet à une fonction de "se souvenir" de l'environnement dans lequel il a été créé, conduisant à des modèles de code puissants et flexibles.
Pour comprendre les fermetures, considérez l'exemple suivant:
<code class="javascript">function outerFunction(x) { let y = 10; function innerFunction() { console.log(xy); } return innerFunction; } const closureExample = outerFunction(5); closureExample(); // Outputs: 15</code>
Dans cet exemple, innerFunction
est une fermeture car elle peut accéder aux variables x
et y
à partir de la portée de outerFunction
, même après l'exécution de outerFunction
.
Les fermetures peuvent être utilisées efficacement de plusieurs manières:
Bien que les fermetures soient puissantes, elles peuvent également conduire à plusieurs pièges communs:
Comportement inattendu dû à l'exécution asynchrone : les fermetures peuvent conduire à des résultats inattendus s'ils ne sont pas utilisés soigneusement dans des contextes asynchrones. Une erreur courante consiste à utiliser une variable de boucle directement dans une fermeture, ce qui entraîne toutes les fermetures faisant référence à la même valeur (finale) de la variable de boucle.
<code class="javascript">for (var i = 0; i </code>
Pour éviter cela, vous pouvez utiliser un iife ou let
capturer la valeur de la variable de boucle à chaque itération.
Les fermetures peuvent améliorer considérablement la confidentialité et l'encapsulation dans les applications JavaScript en permettant aux développeurs de créer des variables et des méthodes privées qui ne sont pas accessibles depuis l'extérieur de la fermeture. Ceci est particulièrement utile dans la programmation orientée objet et les modèles de conception modulaire.
Considérez l'exemple suivant d'un module de compteur à l'aide d'une fermeture:
<code class="javascript">function createCounter() { let count = 0; return { increment: function() { count ; }, getCount: function() { return count; } }; } const counter = createCounter(); counter.increment(); console.log(counter.getCount()); // Outputs: 1 console.log(counter.count); // Outputs: undefined, because 'count' is private</code>
Dans cet exemple, count
est une variable privée qui ne peut être accessible et modifiée que via les méthodes d' increment
et getCount
. Cette encapsulation empêche la manipulation directe du count
de l'extérieur de la fermeture, améliorant la confidentialité des données.
Les fermetures facilitent la création de ce type de code modulaire où l'état interne peut être géré en privé, conduisant à des applications plus propres et plus maintenables.
Les usines de fonction sont une utilisation pratique des fermetures qui vous permettent de créer des fonctions avec des paramètres ou des comportements préconfigurés. Voici quelques exemples:
Fonction de journalisation usine :
<code class="javascript">function createLogger(prefix) { return function(message) { console.log(`${prefix}: ${message}`); }; } const errorLogger = createLogger('ERROR'); const infoLogger = createLogger('INFO'); errorLogger('Something went wrong'); // Outputs: ERROR: Something went wrong infoLogger('Everything is fine'); // Outputs: INFO: Everything is fine</code>
Dans cet exemple, createLogger
est une usine de fonction qui renvoie une fonction de journalisation avec un préfixe préconfiguré.
Usine de calculatrice :
<code class="javascript">function createCalculator(operation) { return function(a, b) { return operation(a, b); }; } const add = createCalculator((a, b) => ab); const multiply = createCalculator((a, b) => a * b); console.log(add(2, 3)); // Outputs: 5 console.log(multiply(2, 3)); // Outputs: 6</code>
Ici, createCalculator
est une usine qui génère des fonctions de calculatrice en fonction de l'opération fournie.
Usine de délai d'expiration :
<code class="javascript">function createTimeout(delay) { return function(callback) { setTimeout(callback, delay); }; } const shortTimeout = createTimeout(1000); const longTimeout = createTimeout(5000); shortTimeout(() => console.log('Short timeout')); longTimeout(() => console.log('Long timeout'));</code>
Dans cet exemple, createTimeout
est une usine qui renvoie les fonctions pour définir des délais d'attente avec des retards prédéfinis.
Ces exemples montrent comment les fermetures peuvent être utilisées pour créer des modèles de code polyvalents et réutilisables, permettant aux développeurs d'adapter les fonctions à des besoins spécifiques tout en maintenant des structures de code propres et modulaires.
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!