Maison > interface Web > js tutoriel > Comprendre les fermetures JavaScript avec des exemples concrets

Comprendre les fermetures JavaScript avec des exemples concrets

DDD
Libérer: 2024-11-24 00:06:13
original
523 Les gens l'ont consulté

Understanding JavaScript Closures with Real-World Examples

Comprendre les fermetures JavaScript avec des exemples concrets

Les fermetures sont l'un des concepts les plus importants en JavaScript. Ils permettent aux fonctions de conserver l'accès à leur portée lexicale même après la fin de l'exécution de la fonction externe. Ce concept apparemment abstrait a de puissantes applications concrètes en programmation.

Dans cet article, nous détaillerons les fermetures avec des explications simples, des exemples pratiques et un cas d'utilisation réel pour consolider votre compréhension.


Que sont les fermetures ?

Une fermeture est une fonctionnalité en JavaScript où une fonction interne a accès aux variables de :

  1. Sa propre portée.
  2. La portée de la fonction externe.
  3. La portée mondiale.

Voici un exemple simple pour illustrer ce concept :

function outerFunction(outerVariable) {
    return function innerFunction(innerVariable) {
        console.log(`Outer Variable: ${outerVariable}`);
        console.log(`Inner Variable: ${innerVariable}`);
    };
}

const newFunction = outerFunction("Hello");
newFunction("World");
Copier après la connexion

Sortir::

Variable externe : Bonjour
Variable interne : Monde

Dans cet exemple :

  • La fonction innerFunction conserve l'accès à externalVariable même une fois l'exécution de externalFunction terminée. C'est ce qu'on appelle une fermeture.

Pourquoi les fermetures sont-elles utiles ?

Les fermetures permettent :
• Encapsulation : protection des variables de la portée globale.
• Gestion de l'état : préservation de l'état lors des appels de fonction.
• Fonctions d'ordre supérieur : activation du comportement dynamique des fonctions.

Exemples pratiques de fermetures

1. Fonction compteur

Une fermeture peut être utilisée pour créer une fonction qui « se souvient » de son état entre les appels.

function createCounter() {
    let count = 0;
    return function () {
        count++;
        return count;
    };
}

const counter = createCounter();
console.log(counter()); // Output: 1
console.log(counter()); // Output: 2
console.log(counter()); // Output: 3
Copier après la connexion

Ici, la variable count est privée à la fonction createCounter et ne peut être modifiée que par la fonction renvoyée.

2. Exemple concret : état d'authentification

Les fermetures sont souvent utilisées dans la gestion des états des applications, comme le suivi de l'authentification des utilisateurs.

function authManager() {
    let isAuthenticated = false;

    return {
        login: function () {
            isAuthenticated = true;
            console.log("User logged in.");
        },
        logout: function () {
            isAuthenticated = false;
            console.log("User logged out.");
        },
        checkAuth: function () {
            console.log(`User is ${isAuthenticated ? "authenticated" : "not authenticated"}.`);
        },
    };
}

const auth = authManager();

auth.checkAuth(); // Output: User is not authenticated.
auth.login();     // Output: User logged in.
auth.checkAuth(); // Output: User is authenticated.
auth.logout();    // Output: User logged out.
auth.checkAuth(); // Output: User is not authenticated.
Copier après la connexion

Explication :

• The isAuthenticated variable is private and cannot be directly accessed from outside.
• The authManager function returns an object with methods (login, logout, and checkAuth) that interact with the private variable.
• This is a real-life use case of closures in state management, providing a secure way to handle data.
Copier après la connexion

3. Utilisation des fermetures dans les minuteries

Les fermetures sont courantes dans la programmation asynchrone. Par exemple, en utilisant setTimeout :

function timer() {
    for (let i = 1; i <= 3; i++) {
        setTimeout(function () {
            console.log(`Timer: ${i}`);
        }, i * 1000);
    }
}

timer();
// Output:
// Timer: 1 (after 1 second)
// Timer: 2 (after 2 seconds)
// Timer: 3 (after 3 seconds)
Copier après la connexion

Pourquoi les fermetures sont-elles importantes ?

Les fermetures font partie intégrante du développement JavaScript moderne pour des raisons telles que :
• Encapsulation : protection des variables sensibles.
• Gestion de l'état : suivi efficace de l'état de l'application.
• Comportement dynamique : renvoi de fonctions adaptées à des cas d'utilisation spécifiques.

Pièges courants

Bien que les fermetures soient puissantes, elles peuvent présenter certains défis :
1. Fuites de mémoire : si les fermetures contiennent inutilement des références à des objets volumineux, l'utilisation de la mémoire peut augmenter.
2. Problèmes de portée : l'utilisation de var à l'intérieur de boucles peut entraîner un comportement inattendu en raison de la portée de sa fonction.

Conclusion

Les fermetures sont un concept fondamental en JavaScript qui permet des modèles de programmation puissants et flexibles. Que vous créiez des compteurs, gériez l'authentification ou travailliez avec des minuteries, les fermetures offrent un moyen propre et efficace de gérer la portée et l'état.

Quelle est la prochaine étape ?

Essayez les exemples ci-dessus dans vos propres projets ! Avez-vous une façon unique d’utiliser les fermetures ? Partagez vos idées dans les commentaires ci-dessous. ?

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!

source:dev.to
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal