Javascript를 공부하면서 this를 마주했을때 꽤나 큰 멘붕(?)이 왔다. Java를 먼저 공부해서 그런지 Javascript의 this를 이해하는데 굉장한 어려움을 겪었다. (Java의 this도 잘 이해못할지도..?)
혼자 예제를 만들어내고 공부를 하던 중 기록으로 남기고 싶어 포스팅하게 되었다.
Javascript의 this가 사용될수 있는 경우는 아래와 같이 굉장히 다양하다.
이 중에서도 일반함수에서의 this와 화살표함수에서의 this를 중점적으로 다루어보자
함수 내에서의 this는 딱 두가지만 기억하면 될 것같다.
let name = '전역';
let a = {
name: '지역',
age: 100,
play() {
console.log(this == a); // 1-1
console.log(this === a); // 1-2
console.log(this.name); // 1-3
let play2 = () => {
console.log(this === a); // 1-4
console.log(this.name); // 1-5
};
console.log('');
console.log('play2 실행');
play2();
console.log('');
},
play1: () => {
console.log(this === a); // 2-1
console.log(name); // 2-2
},
};
a.play();
a.play1();
console.log(name);
위 코드의 this를 모두 이해했다면 함수내에서 this는 정복한게 아닐까 라고 생각한다.
개인적으로 1-4,5 부분이 굉장히 이해하기 어려웠다.. 차례대로 알아보도록 하자
play()함수 내에서 this를 묻는 질문이다.
이 경우, play를 호출한 객체는 a이기 때문에 this는 a를 가리키게 된다.
play2 함수는 play함수 내에서 정의된 함수이다.
즉, play 함수가 play2 함수를 호출한 격이 되는데 [ window / 전역객체 ⇒ a ⇒ play() ⇒ play2 ] 순서대로 호출한 것이다.
play2 함수는 화살표 함수로 정의되었기 때문에 자체적으로 this를 가지지 않기에 상위 객체의 this를 끌어쓰게되고, play() 함수내에서의 this와 동일한 작용을 하게되는 것이다.
1-4, 1-5 예제와 동일한 화살표 함수지만, 이번엔 a 객체에서 바로 호출되는 함수이다.
즉, a 객체가 play1()함수를 호출한 격이 되기에, [ window / 전역객체 ⇒ a ⇒ play1() ] 순서대로 호출한게 된다.
play1() 함수도 화살표 함수로 정의되었기에 a가 아닌 그 상위, window / 전역객체 를 가리키게 된다.
this를 이해하는데 문제가 생기면 정보를 추가할 예정이다..