this는 객체의 프로퍼티나 메서드를 참조하기 위한 자기 참조 변수입니다.
브라우저의 경우 전역에서의 this = window입니다.(Node.js에서 전역 객체는 global)
개발자 도구에 냅다 this를 찍어보면 window 객체가 출력되는 걸 알 수 있습니다.
window 객체는 브라우저 최상위에 있는 객체로 전역으로 선언한 변수나 함수, DOM, BOM 등이 속합니다.
전역 변수 apple은 window 객체 안에 저장됩니다. 여기서 this는 window에 해당하기 때문에 this.apple도 같은 결과를 출력합니다.
💡브라우저에서 전역 변수와 함수는 window라는 전역 객체 안에 저장되어 있다. 함수는 window 객체 안에 있는 메서드라고도 볼 수 있다.
메서드 내부의 this는 메서드를 소유한 객체가 아니라 메서드를 호출한 객체에 바인딩됩니다.
여기서 obj.printThis( )의 경우 obj가 함수를 호출한 주체가 되어 this는 obj를 가리킵니다.
apply, call, bind 메서드를 이용해 this로 사용할 객체를 지정하는 방법도 있습니다. 이 부분은 아래에서 자세히 다루겠습니다.
this에는 생성자 함수로 생성된 인스턴스가 바인딩됩니다.
이벤트 리스너 안의 this는 대부분 e.currentTarget로 사용된다고 합니다. 이 부분은 DOM 공부할 때 다시 다뤄보겠습니다.
객체를 생성하지 않은 일반 함수에서 this는 의미가 없습니다.
전역 함수 뿐만 아니라 중첩 함수를 일반 함수로 호출하는 경우에도 함수 내부의 this는 전역 객체가 바인딩됩니다.
inner( )와 outer( ) 모두 this가 전역 객체를 나타냅니다.
outer( )은 메서드로 호출이 되고 inner( )은 일반 함수로 호출하였습니다. 일반 함수로 호출된 경우에는 메서드 내에 있더라도 전역 객체가 바인딩됩니다.
💡일반 함수로 호출된 모든 함수의 내부의 this에는 전역 객체가 바인딩된다.
메서드를 호출한 객체가 this가 됩니다.
화살표 함수는 화살표 함수 자체로 스코프를 만들지 않고 자신과 가장 가까운 상위 함수의 스코프에서 this 값을 받아옵니다.
inner의 this는 생성 시점에 결정됩니다.
위에서 메서드 내 중첩 함수를 일반 함수로 작성한 경우를 살펴봤습니다. 중첩 함수를 화살표 함수로 작성하면 어떻게 될까요?
화살표 함수로 작성된 inner( )의 상위 함수는 일반 함수로 작성된 outer( ) 메서드입니다. 따라서 inner( )의 this는 가장 가까운 상위의 일반 함수 outer( ) 메서드의 this와 같습니다.
printThis 메서드를 printObjThis 변수에 할당하여 함수를 참조해 보겠습니다.
참조에 의해 호출되는 경우 this는 전역 객체를 가리킵니다.
this의 값이 호출에 의해 설정되지 않으므로, 기본값으로 브라우저에서는 window인 전역 객체를 참조합니다.
생성자 함수 내부 this에는 생성자 함수가 생성할 인스턴스가 바인딩됩니다.
만약 new 연산자를 사용하지 않으면 일반 함수로 동작해 this가 window로 바인딩 되어 printThis를 찾을 수 없다.
apply, call 메서드를 이용하면 this를 지정해 함수를 호출할 수 있습니다.
bind의 경우 지정한 this가 적용된 새로운 함수를 생성해 반환합니다.
모던 자바스크립트 Deep Dive
mozilla
poiemaweb 6.3 Arrow function
자바스크립트 this? 간단히 핵심만 파악하기
슬로건이 완벽주의를 꿈꾸는 나라니... 어쩐지 버그 잡아주실때부터 알아봤습니다~ 글 잘 읽고 갑니다!