首頁  >  文章  >  web前端  >  在循環中使用事件監聽器時如何避免關閉問題?

在循環中使用事件監聽器時如何避免關閉問題?

Susan Sarandon
Susan Sarandon原創
2024-11-21 16:32:11740瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn