> 웹 프론트엔드 > JS 튜토리얼 > JavaScript 루프의 이벤트 리스너가 항상 마지막 요소를 대상으로 하는 이유는 무엇입니까?

JavaScript 루프의 이벤트 리스너가 항상 마지막 요소를 대상으로 하는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-11-10 04:25:02
원래의
948명이 탐색했습니다.

Why do Event Listeners in JavaScript Loops Always Target the Last Element?

루프의 이벤트 리스너 동작 이해

JavaScript에서 이벤트 리스너를 사용하면 요소가 사용자 작업에 응답할 수 있습니다. 루프를 사용하여 여러 개체에 이벤트 리스너를 추가하면 리스너 기능에 대한 우려가 발생할 수 있습니다.

기존 접근 방식의 문제

다음 상황을 고려하세요. "컨테이너" 클래스 내의 여러 요소에 대한 클릭 이벤트 리스너입니다. 그러나 전통적인 for 루프를 사용하면 모든 리스너가 결국 루프의 마지막 요소를 대상으로 한다는 것을 알 수 있습니다.

이유: 클로저

이 동작이 발생합니다. JavaScript의 클로저로 인해. 루프 내에서 변수를 할당하면 동일한 메모리 위치를 참조합니다. 따라서 이벤트 리스너 함수에서 이러한 변수에 액세스하려고 하면 항상 마지막 반복 값을 참조합니다.

해결책: 즉시 호출

이 문제를 해결하려면 문제가 발생하면 루프 내에서 즉시 호출을 사용하세요. 이렇게 하면 각 반복마다 새 실행 컨텍스트를 생성하여 해당 컨텍스트 내의 변수가 로컬로 유지되고 루프 변수에 바인딩되지 않도록 합니다.

고정 코드:

아래의 수정된 코드는 원하는 동작을 달성하기 위해 즉시 호출을 사용합니다.

// 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
}
로그인 후 복사

이 수정된 코드에서 즉시 호출은 호출은 각 반복에 대해 새로운 실행 컨텍스트를 생성하여 boxa 및 boxb 변수가 이벤트 리스너 함수 내에서 적절한 값을 유지할 수 있도록 합니다.

위 내용은 JavaScript 루프의 이벤트 리스너가 항상 마지막 요소를 대상으로 하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿