Maison > interface Web > js tutoriel > le corps du texte

Comment résoudre les problèmes liés aux références de variables de fermeture dans les boucles JavaScript ?

Linda Hamilton
Libérer: 2024-10-16 17:48:02
original
235 Les gens l'ont consulté

How to Resolve Issues with Closure Variable References in JavaScript Loops?

Fermeture JavaScript à l'intérieur des boucles : comprendre le problème et ses solutions

Le problème survient lors de l'utilisation de fermetures à l'intérieur de boucles avec des déclarations de variables à l'aide du mot-clé var . Les fermetures capturent l'environnement dans lequel elles sont définies, y compris les variables, et créent une référence à celles-ci, même après la sortie de la fonction. Cela peut entraîner un comportement inattendu lorsque la variable capturée change de valeur pendant l'exécution de la boucle.

Le problème :

Considérez le code suivant :

<code>for (var i = 0; i < 3; i++) {
  funcs[i] = function() {
    console.log("My value:", i);
  };
}</code>
Copier après la connexion

Ce code crée une boucle qui itère trois fois. A l'intérieur de chaque itération, une fonction est définie et stockée dans un tableau. Le résultat attendu serait :

<code>My value: 0
My value: 1
My value: 2</code>
Copier après la connexion

Cependant, le résultat réel est :

<code>My value: 3
My value: 3
My value: 3</code>
Copier après la connexion

C'est parce que la variable i est capturée par les fermetures et qu'elle est mise à jour vers la version finale valeur de 3 avant l'exécution de l'une des fermetures.

Solution ES6 : utilisation du mot-clé 'let'

ECMAScript 6 (ES6) introduit le mot-clé let, qui crée un bloc -variables de portée. Dans notre exemple, nous pouvons utiliser let au lieu de var pour créer une nouvelle variable i pour chaque itération :

<code>for (let i = 0; i < 3; i++) {
  funcs[i] = function() {
    console.log("My value:", i);
  };
}</code>
Copier après la connexion

Cette fois, chaque fermeture capturera sa propre variable i distincte et le résultat attendu sera obtenu .

Solution ES5.1 : Utiliser 'forEach'

La méthode Array.prototype.forEach de JavaScript fournit un moyen propre d'itérer sur un tableau. Chaque fonction de rappel transmise à forEach obtient une fermeture distincte autour de l'élément actuel :

<code>var someArray = [ /* whatever */ ];
someArray.forEach(function(element) {
  // Code specific to this element
});</code>
Copier après la connexion

Solution classique : utilisation de fermetures

Les fermetures peuvent être utilisées pour lier la variable à une valeur spécifique en dehors de la fonction :

<code>function createfunc(i) {
  return function() {
    console.log("My value:", i);
  };
}

var funcs = [];
for (var i = 0; i < 3; i++) {
  funcs[i] = createfunc(i);
}</code>
Copier après la connexion

Ici, une fermeture spécifique à i est créée à l'aide de createfunc puis stockée dans le tableau funcs. Lorsque chacune de ces fermetures est exécutée, elles font référence à la variable i correspondante, ce qui donne le résultat correct.

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:php
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!