Maison  >  Article  >  interface Web  >  Pourquoi les gestionnaires d'événements dans les boucles JavaScript font-ils référence aux mêmes variables ?

Pourquoi les gestionnaires d'événements dans les boucles JavaScript font-ils référence aux mêmes variables ?

DDD
DDDoriginal
2024-11-05 20:36:02622parcourir

Why Do Event Handlers in JavaScript Loops Refer to the Same Variables?

Travailler avec des gestionnaires d'événements dans des boucles JavaScript : utiliser des fermetures pour la gestion d'événements distincts

En JavaScript, lorsque vous travaillez avec du code HTML, les gestionnaires d'événements jouent un rôle crucial pour permettre les interactions des utilisateurs avec la page Web. Cependant, un défi courant survient lorsque ces gestionnaires d'événements sont définis dans une boucle, conduisant à un comportement inattendu.

Pour illustrer ce problème, considérons l'extrait de code suivant :

<code class="javascript">var blah = xmlres.getElementsByTagName('blah');
for(var i = 0; i < blah.length; i++) {
    var td = document.createElement('td');
    var select = document.createElement('select');
    select.setAttribute("...", "...");
    select.onchange = function() {
        onStatusChanged(select, callid, anotherid);
    };
    td.appendChild(select);
}

Lors d'un changement est déclenché pour un événement élément qui a déclenché l’événement. Ce comportement découle de la façon dont JavaScript implémente les fermetures lors de la définition des gestionnaires d'événements.

Plus précisément, au sein de la boucle, la fermeture select.onchange = function() fait référence aux variables callid et anotherid, qui portent les valeurs attribuées lors de la dernière itération de la boucle. Par conséquent, lorsqu'un événement est déclenché, les valeurs de ces variables ne sont pas celles associées à l'attribut élément qui déclenche l'événement.

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