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

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

Linda Hamilton
Linda Hamiltonoriginal
2024-10-16 17:48:02236parcourir

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>

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>

Cependant, le résultat réel est :

<code>My value: 3
My value: 3
My value: 3</code>

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>

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>

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>

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!

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