Maison  >  Article  >  interface Web  >  Le code JavaScript de votre ami utilise-t-il réellement des fermetures ?

Le code JavaScript de votre ami utilise-t-il réellement des fermetures ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-01 06:11:02453parcourir

Is Your Friend's JavaScript Code Actually Using Closures?

Fermetures JavaScript et fonctions anonymes

Question :

Dans une discussion sur les fermetures en JavaScript, un ami a affirmé que leur mise en œuvre manquait de fermetures, tandis que l'autre affirmait le contraire. Pouvez-vous déterminer quelle solution utilise des fermetures en appliquant le concept de fermetures ?

Solution :

Définition de fermeture : Une fermeture en JavaScript fait référence à un sous-ensemble de fonctions avec des variables libres (variables définies dans une portée parent) référencées à partir d'une portée différente. Lorsqu'une fermeture est référencée en dehors de sa portée parent, elle se ferme sur la valeur positive (la variable libre) de cette portée.

Cas 1 : le programme de votre ami

<code class="js">for (var i = 0; i < 10; i++) {
    (function f() {
        var i2 = i;
        setTimeout(function g() {
            console.log(i2);
        }, 1000);
    })();
}</code>

Analyse :

  • La fonction f n'est pas une fermeture car toutes les variables libres (i, setTimeout et console) sont liées à la portée globale, et aucune d'entre elles n'est fermée over.
  • La fonction g, cependant, est une fermeture car elle se ferme sur la variable i2, qui est liée à la portée de f. Lorsque g est référencé depuis setTimeout, il conserve l'accès à i2.

Cas 2 : Votre programme

<code class="js">for (var i = 0; i < 10; i++) {
    setTimeout((function f(i2) {
        return function g() {
            console.log(i2);
        };
    })(i), 1000);
}</code>

Analyse :

  • La fonction f n'est pas une fermeture car elle n'a pas de variables libres.
  • La fonction g, cependant, est une fermeture car elle se ferme sur la variable i2, qui est liée au champ d’application de f. Lorsque g est référencé depuis setTimeout, il conserve l'accès à i2.

Conclusion :

Vous et votre ami utilisez des fermetures dans vos implémentations. La différence est que dans le programme de votre ami, la fermeture est créée dans la fonction interne g, tandis que dans votre programme, la fermeture est créée dans la fonction externe f.

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