콜백함수를 쓰면 this가 전부 이렇게 변한다~라고 싸잡아서 이해할 순 없습니다. 콜백함수가 담긴 곳을 살펴봐야합니다.
그리고 함수를 여러개 중첩해서 쓴다고 해도 최종적으로는 this와 가장 가까운 함수에 의해 this가 변한다고 생각하시면 됩니다.
원리를 더 설명해드리자면
극 일반화해서 쉽게 설명하자면 대충 쓴 일반함수, 그리고 그 함수의 콜백함수 안에서는 this의 의미가 window가 맞습니다.
근데 더 정확한 설명은 내가 담겨있는 object가 this의 정확한 의미입니다.
setTimeout은 뭐 어디다가 쩜찍어서 오브젝트1.setTimeout을 했다면 setTimeout 내의 function(){} 안에서의 this는 오브젝트1 로 설정됩니다.
addEventListener도 마찬가지로 특정 오브젝트2.addEventListener 이렇게 썼다면 addEventListener 내의 function(){} 안에서의 this는 오브젝트2 로 설정됩니다.
근데 setTimeout 은 어디 담겨있지 않기 때문에 오브젝트1.setTimeout 이렇게 쓰진 않죠?
실은 어디 담겨있습니다. window라는 이상한 오브젝트 보관함이 있는데 거기 setTimeout이 미리 담겨있습니다.
그짓말같다면 콘솔창에 window를 출력해서 까보시면 진짜 들어있긴 합니다. window = { setTimeout : 어쩌구, ... } 이렇게 되어있을겁니다.
window는 변수보관통인데 변수강의에서 아마 설명할 예정이라 왜 그런지는 스킵합시다.
아무튼 window에 보관되어있기 때문에 그래서 우리가 setTimeout() 이렇게 써도 컴퓨터는 window.setTimeout() 이렇게 해석합니다.
그래서 안에서 this를 쓰시면 window가 나오는게 정확한 원리데스
근데 "내가 setTimeout이 window에 박혀있는지 어찌압니까" 라는 점 때문에 대충 근본없는 함수 아무거나 그 안에서 this쓰면 this는 window라고 생각하면 되겠습니다.