Maison >interface Web >js tutoriel >Quelle est la différence entre les fermetures JavaScript et les fonctions anonymes ?

Quelle est la différence entre les fermetures JavaScript et les fonctions anonymes ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-29 18:18:45787parcourir

What's the difference between JavaScript closures and anonymous functions?

Fermetures JavaScript et fonctions anonymes

Les fermetures sont un concept crucial en JavaScript, permettant aux fonctions d'accéder aux variables à partir de leur portée englobante, même après la la fonction est invoquée. Cependant, il est important de faire la différence entre les fermetures et les fonctions anonymes.

Prenons un exemple courant : utiliser une boucle et setTimeout pour retarder la journalisation d'une variable de compteur. Sans utiliser de fermetures, le code imprimerait la valeur finale plusieurs fois.

Utilisation incorrecte de la fermeture :

for (var i = 0; i < 10; i++) {
  setTimeout(function() {
    console.log(i); // This incorrectly prints 10 for each iteration
  }, 1000);
}

Le problème ici est que la fonction anonyme ne fonctionne pas capturer la valeur de i pour chaque itération. Au lieu de cela, il capture la référence à i dans la portée globale, qui atteint finalement la valeur finale de 10.

Utilisation correcte de la fermeture :

for (var i = 0; i < 10; i++) {
  (function() {
    var i2 = i;
    setTimeout(function() {
      console.log(i2); // This correctly prints 0 to 9 with delay
    }, 1000);
  })();
}

Dans ce cas , la fonction anonyme crée une nouvelle variable i2, qui est initialisée avec la valeur actuelle de i. La fonction anonyme interne capture ensuite la valeur de i2 et l'utilise pour la journalisation, préservant ainsi la valeur de l'itération d'origine.

Distinction entre les fermetures et les fonctions anonymes :

Alors que toutes les fonctions en JavaScript « ferment » techniquement leurs variables, le terme « fermeture » est généralement réservé aux fonctions qui :

  • Avoir accès aux variables à partir d'une portée externe (c'est-à-dire non locale ou " variables "libres)
  • Sont référencées en dehors de la portée dans laquelle elles sont définies (c'est-à-dire "fermées" autour de leurs variables libres)

Dans le premier exemple, la fonction anonyme ne ne répond pas à ces critères car il ne capture pas la variable i. Dans le deuxième exemple, la fonction anonyme satisfait à ces conditions et est donc considérée comme une fermeture.

Conclusion :

Comprendre la distinction entre les fermetures et les fonctions anonymes est crucial pour en utilisant efficacement la puissance de JavaScript. Les fermetures permettent aux fonctions d'interagir avec leur portée englobante, fournissant une encapsulation et permettant un accès retardé aux variables, ce qui est particulièrement bénéfique pour les opérations asynchrones et la gestion des événements.

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