함수를 인자로 어딘가에 전달 할때 class 정보는 함께 전달되지 않는다.
this.onClick 에서 class 정보가 함께 전달되어져야 할 것 같지만 그렇지 않다.
export default class Field {
constructor() {
this.field = document.querySelector('.field');
this.fieldRect = this.field.getBoundingClientRect();
this.imgsArr = [];
this.id = 0;
this.field.addEventListener('click', **this.onClick**);
}
onClick(event) {
const target = event.target;
if (target.matches('.carrot')) {
target.style.opacity = 0;
target.classList.add('hidden');
**this.onItemClick && this.onItemClick('carrot');**
}
else if (target.matches('.bug')) {
**this.onItemClick && this.onItemClick('bug');**
}
}
}
onClick 에서 **this.onItemClick** 의 this 정보가 남아있지 않게 된다. 따라서
onItemClick 이 undefined 가 된다.
JS 에서 어떤 class에 있는 함수를 누군가에게 전달 해 줄 때는 class 정보가 무시되 때문에
무시하고 싶지 않을때는 함수를 class 와 binding 해 줘야한다.
방법 1.
this.field.addEventListener('click', **this.onClick.bind(this)**);
방법 2.
arrowFunction 을 사용한다. arrow func 는 this 가 유지 된다.
this.field.addEventListener('click', (event) => **this.onClick(event)**);
방법 3.
함수를 멤버변수로 만들고 arrow func 를 가리킨다.
onClick = event => {
const target = event.target;
if (target.matches('.carrot')) {
target.style.opacity = 0;
target.classList.add('hidden');
**this.onItemClick && this.onItemClick('carrot');**
}
else if (target.matches('.bug')) {
**this.onItemClick && this.onItemClick('bug');**
}
}
}