✅ 딥다이브 스터디 진행 (깃헙 자료 보러가기)
✅ 기술 면접 스터디 (깃헙 바로가기)
✅ Next.js 강의 듣기
✅ React 에서의 불변성 포스팅 바로가기
✅ 쿠키, 세션 기반 인증과 토큰(JWT) 기반 인증 포스팅 바로가기
✅ 검색봇한테 잘 보이는 법 - SEO(검색 엔진 최적화) 바로가기
비동기 작업을 하나씩 작동 시키기 위해 올려보내주는 역할을 하는 것이 이벤트 루프이다.
그리고 이벤트 루프에 의해 콜스택에 들어가 실행되기 전의 콜백함수가 대기하고 있는 곳을 Callback Queue 혹은 Task Queue라고 한다. (참고 자료)
그리고 콜백큐 안에는 두가지의 task로 나뉘어지고 우선순위도 부여된다.
setTimeout, setInterval, setImmediate, requestAnimationFrame, I/O, UI Rendering
process.nextTick, Promise, Object.observe, MutationObserver
Micro Task Queue가 우선 순위가 높아서, 먼저 모두 실행되어지고 후에 Macro Task Queue가 실행된다.
콜백큐가 또 두가지로 나뉘어진다는 사실은 이번에 처음 알게되어 새로웠다!
우선 그냥 함수 호출하는 경우에 대해 이해하고 넘어가자.
const mingming = {
name: '지민',
hi: function() {
const sayName = function() {
console.log(this);
}
sayName();
}
};
mingming.hi() // 전역 객체
일반적으로 함수를 그냥 호출하게되면 해당 함수 안의 this는 전역을 가리킨다.
mingming.hi()
찍으니까 window 전역 객체가 찍힌것을 확인할 수 있다.
const mingming = {
name: '지민',
hi: function() {
const sayName = function() {
console.log(this.name);
}
sayName();
}
};
mingming.hi() // undefined
만약 this.name을 찍으면 어떻게 될까?
undefined가 출력된다. 왜냐면 전역 객체에는 name이라는 프로퍼티가 존재하지 않기 때문이다.
그럼 화살표 함수는 어떨까?
const mingming = {
name: '지민',
hi: function() {
const sayName =()=> {
console.log(this);
}
sayName();
}
};
mingming.hi() // {name: '지민', hi: ƒ}
객체가 찍히게 되었다.
그로인해 this.name을 해주게 되면
const mingming = {
name: '지민',
hi: function() {
const sayName =()=> {
console.log(this.name);
}
sayName();
}
};
mingming.hi() // 지민
지민
이 잘 찍힌다!
일반 함수에서는 this를 부여하되 값을 지정해주지 않는다면, 화살표 함수에서는 this가 존재하지 않는다.
그래서 화살표 함수는 상위 스코프에서 this를 참조하게 된다.
❗️하지만 문제는 addEventListener
에서의 화살표 함수 this이다.
const button = document.getElementById('mingButton');
button.addEventListener('click', () => {
console.log(this); // Window 전역 객체
this.innerHTML = 'clicked';
});
button.addEventListener('click', function() {
console.log(this); // mingButton 엘리먼트
this.innerHTML = 'clicked';
});
이미 addEventListener
콜백 함수는 this에 이벤트가 적용된 요소가 바인딩 되도록 설정되어있다.
그래서 이 때 화살표 함수를 사용하게 되면, 기존 바인딩 된 요소가 사라지고 상위 스코프를 참조하게 되어 원하는 값이 나오지 않을 수 있으니 주의가 필요하다!