Maison >interface Web >js tutoriel >Comment les fermetures peuvent-elles aider à éviter les références partagées lors de la création de gestionnaires d'événements dans des boucles JavaScript ?

Comment les fermetures peuvent-elles aider à éviter les références partagées lors de la création de gestionnaires d'événements dans des boucles JavaScript ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-07 04:07:30525parcourir

How Can Closures Help Avoid Shared References When Creating Event Handlers in JavaScript Loops?

Création de gestionnaires d'événements avec fermeture en Javascript

Dans la programmation Javascript, il est courant de créer des gestionnaires d'événements à l'intérieur de boucles. Cependant, lorsque vous utilisez une syntaxe telle que select.onchange = function(), il est crucial d'être conscient du problème potentiel lié aux références partagées.

Lorsqu'un gestionnaire d'événements est affecté dans une boucle utilisant cette syntaxe, cela peut entraîner à tous les gestionnaires d'événements pointant vers les mêmes variables, qui contiendront les valeurs finales attribuées dans la boucle. Cela peut entraîner la transmission des mêmes paramètres au gestionnaire d'événements pour tous les événements, quelle que soit l'itération individuelle.

Pour résoudre ce problème et empêcher les références à des variables partagées, une fermeture est nécessaire. Une fermeture implique la création d'une fonction interne qui capture les variables de la fonction externe par référence. Cette fonction interne peut ensuite être utilisée comme gestionnaire d'événements, garantissant que chaque gestionnaire d'événements possède sa propre copie des variables de l'itération de boucle correspondante.

Pour l'exemple donné dans la question, le code ci-dessous montre comment implémentez une fermeture et transmettez les paramètres corrects au gestionnaire d'événements :

<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(s,c,a) {
        return function() {
            onStatusChanged(s,c,a);
        }
    }(select, callid, anotherid);
    td.appendChild(select);
}</code>

Dans ce code, la fonction interne anonyme renvoie la fonction utilisée comme gestionnaire d'événements. Les paramètres (s,c,a) de la fonction sont capturés par référence, garantissant que chaque gestionnaire d'événements possède son propre ensemble unique de variables. Par conséquent, les paramètres corrects seront transmis à la méthode onStatusChanged lorsqu'un événement se produit.

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