프로그래밍/
[JavaScript] closure을 사용한 addEventListner for문
모영이
2021. 1. 31. 16:56
addEventListner을 반복해서 button에 달아야 할 때가 발생했는데, 엄청난 문제점을 발견했고 새로 알게된 사실을 정리하려고 한다.
112 추가한다.
이렇게 하면 되는데? 원하는 답은 아니지만, 문제가 없다는 걸 알 수 있다.
var tmp00 = new Item(list);
tmp00.btn.addEventListener('click', function() {clickButton(tmp00)});
items[0] = tmp00;
var tmp01 = new Item(list);
tmp01.btn.addEventListener('click', function() {clickButton(tmp01)});
items[1] = tmp01;
var tmp02 = new Item(list);
tmp02.btn.addEventListener('click', function() {clickButton(tmp02)});
items[2] = tmp02;
See the Pen jOVErJX by mooyoung2309 (@mooyoung2309) on CodePen.
그냥 for문을 사용한다. (오답)
눌러보면 어떤 버튼을 눌러도 마지막 버튼만 동작하는걸 확인할 수 있다. 진짜 화가났다.
for(var i=0; i<3; i++) {
var tmp = new Item(list);
tmp.btn.addEventListener('click', function() {clickButton(tmp)});
items[i] = tmp;
}
See the Pen test-addEventListner02 by mooyoung2309 (@mooyoung2309) on CodePen.
for문, 클로저(Closure)를 사용한다. (정답)
클로저가 뭔지는 공부를 하고나서 정리하고, 일단 대충 함수안에 넣는 것 같다. 따라서 해봤더니 됐다.
for(var i=0; i<3; i++) {
(function() {
var tmp = new Item(list);
tmp.btn.addEventListener('click', function() {clickButton(tmp)});
items[i] = tmp;
})();
}
See the Pen test-addEventListner01 by mooyoung2309 (@mooyoung2309) on CodePen.