Phil's answer은 (+1) 게시 한 코드 코드에 대한 좋은 해결책을 제공하지만 문제가 원래 코드와 어떤 관계가 있는지 설명하지 않습니다.
문제는 이벤트 핸들러 폐쇄가 가 index
변수를 참조를 지속 얻을 수 있다는 것입니다 아닌 그들이 생성 할 때의로의를 복사합니다. 따라서 그들은 모두 index
에()의 최종 값을 표시합니다. 시간 제한이 발생할 때, 예를 들면,이 코드
for (index = 0; index < 4; ++index) {
setTimeout(function() {
console.log(index);
}, 100);
}
는 없다 ... "0", "1", "2"및 "3", "4"네 번 기록한다.
일반적인 값으로 핸들러가 특정 값으로 닫히는 지 확인하려면 이벤트 핸들러 함수를 생성하는 팩토리 함수를 사용하십시오. 여기서 이벤트 핸들러는 팩토리에 제공하는 인수를 닫습니다 대신 루프 변수의 기능 :
for(index=0; index<divs.length; index++) {
divs[index].addEventListener("click", createHandler(divs[index], true); //capture click event
}
function createHandler(div) {
return function(){
console.log(div.getAttribute("id"));
};
}
이 이벤트 핸들러는 변경되지 않습니다 div
위에 닫습니다.
클로저는 JavaScript의 가장 강력한 기능 중 하나입니다.그들이 어떻게 작동하는지 이해하면 (실제로 사람들이 생각하는 것보다 훨씬 간단합니다), 정말로 좋은 효과를 내기 위해 사용할 수 있습니다. 기타 : Closures are not complicated
자바 스크립트 클로저에 대해 읽고 코드를 편집하십시오. 변수 범위 문제입니다. – DhruvPathak