Maison > interface Web > js tutoriel > Pourquoi les gestionnaires de clics dans les boucles présentent-ils un comportement inattendu ?

Pourquoi les gestionnaires de clics dans les boucles présentent-ils un comportement inattendu ?

Mary-Kate Olsen
Libérer: 2024-11-27 01:47:11
original
476 Les gens l'ont consulté

Why Do Click Handlers in Loops Exhibit Unexpected Behavior?

Gestion appropriée des fermetures pour les gestionnaires de clics dans les boucles

Problème :

L'attribution de gestionnaires de clics à plusieurs éléments dans une boucle peut conduire à un comportement inattendu. Plus précisément, cliquer sur un élément particulier peut déclencher une action sans rapport avec cet élément. Quelle est la cause première de ce problème ?

Explication :

Le problème survient lors de l'utilisation de fermetures dans une boucle. Lorsqu'une fermeture est créée dans une boucle, elle conserve une référence à la variable de boucle. Dans ce cas, cette variable est i. Cependant, au fur et à mesure que la boucle progresse, i est mis à jour à chaque itération. Par conséquent, lorsque le gestionnaire de clics est exécuté, il utilise la valeur finale de i (20 dans ce cas), quel que soit l'élément sur lequel le clic a été effectué.

Solution :

Pour résoudre ce problème, une fonction de rappel peut être utilisée pour créer une nouvelle fermeture pour chaque gestionnaire de clic. Cela garantit que chaque gestionnaire a sa propre référence unique à la variable de boucle.

function createCallback(i) {
  return function() {
    alert('you clicked ' + i);
  };
}
Copier après la connexion

Dans la boucle, cette fonction de rappel peut être attribuée à chaque gestionnaire de clic, en préservant la valeur correcte de i pour chaque élément.

for (var i = 0; i < 20; i++) {
  $('#question' + i).click(createCallback(i));
}
Copier après la connexion

Alternative moderne dans ES6 :

ES6 introduit le mot-clé let, qui permet variables de portée bloc. Cela signifie que la variable i dans la boucle sera locale à cette boucle, éliminant ainsi le besoin d'une fonction de rappel.

for (let i = 0; i < 20; i++) {
  $('#question' + i).click(function() {
    alert('you clicked ' + i);
  });
}
Copier après la connexion

Cette approche est plus concise et plus facile à lire, ce qui en fait une option privilégiée pour les environnements modernes. Développement JavaScript.

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.cn
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