ホームページ  >  記事  >  ウェブフロントエンド  >  ループ内でイベント リスナーを使用するときにクロージャの問題を回避するにはどうすればよいですか?

ループ内でイベント リスナーを使用するときにクロージャの問題を回避するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-21 16:32:11758ブラウズ

How to Avoid Closure Issues When Using Event Listeners in a Loop?

ループ内でイベント リスナーを使用する場合のクロージャの問題の回避

for ループを使用してイベント リスナーを複数の要素にアタッチしようとすると、すべてのリスナーが最後のオブジェクトをターゲットにしてしまうという問題が発生しました。これは、JavaScript でのクロージャの動作方法によるものです。

クロージャを理解する

関数がスコープ外で宣言された変数を参照する場合、関数は、たとえその変数へのアクセスを保持します。関数が終了した後。あなたの場合、ループ内で定義されたイベント リスナー関数は、ループの外で定義されている boxa と boxb を参照します。ループが完了すると、これらの変数はループ内の最後の要素を指します。

問題の修正

このクロージャーの問題を回避するには、すぐに呼び出される関数を使用できます。ループ内の式 (IIFE)。 IIFE は新しいスコープを作成するため、その中で宣言された変数には関数の外部からアクセスできません。

改訂されたコード

IIFE を配置した改訂されたコードは次のとおりです。

// Function to run on click:
function makeItHappen(elem, elem2) {
  var el = document.getElementById(elem);
  el.style.backgroundColor = "red";
  var el2 = document.getElementById(elem2);
  el2.style.backgroundColor = "blue";
}

// Autoloading function to add the listeners:
var elem = document.getElementsByClassName("triggerClass");

for (var i = 0; i < elem.length; i += 2) {
  (function () {
    var k = i + 1;
    var boxa = elem[i].parentNode.id;
    var boxb = elem[k].parentNode.id;
    elem[i].addEventListener("click", function() {
      makeItHappen(boxa, boxb);
    }, false);
    elem[k].addEventListener("click", function() {
      makeItHappen(boxb, boxa);
    }, false);
  }()); // immediate invocation
}

IIFE を使用すると、各イベント リスナー関数が独自のスコープを持つようになり、クロージャーが防止されます。 問題。これで、各イベント リスナーはループ内の対応する要素を正しくターゲットにするようになります。

以上がループ内でイベント リスナーを使用するときにクロージャの問題を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。