EnJinnier
JS Deep Dive - 22. this 본문
22.1 this 키워드
객체는 상태를 나타내는 프로퍼티와 동작을 나타내는 메서드를 하나의 논리적인 단위로 묶은 복합적인 자료구조이다.
이때 동작을 나타내는 메서드는 자신이 속한 객체의 상태, 즉 프로퍼티를 참조하고 변경할 수 있어야 하며
이때 메서드가 자신이 속한 객체의 프로퍼티를 참조하려면 먼저 자신이 속한 객체를 가리키는 식별자를 참조할 수 있어야 한다.
this는 자신이 속한 객체 또는 자신이 생성할 인스턴스를 가리키는 자기 참조 변수이다.
this를 통해 자신이 속한 객체 또는 자신이 생성할 인스턴스의 프로퍼티나 메서드를 참조할 수 있다.

this가 언제나 클래스가 생성하는 인스턴스를 가리키는 자바나 C++같은 클래스 기반 언어와 다르게
자바스크립트의 this는 함수가 호출되는 방식에 따라 this에 바인딩 될 값, 즉 this 바인딩이 동적으로 결정된다.
또한 this코드는 어디에서든 참조가 가능하고 전역에서도 함수 내부에서도 참조할 수 있다.
다만 strict mode가 적용된 일반 함수 내부의 this에는 undefined가 바인딩된다.(객체의 메서드 내부 또는 생성자 함수 내부에서만 의미가 있기 때문)
22.2 함수 호출 방식과 this 바인딩
this 바인딩(this에 바인딩될 값)은 함수 호출 방식, 즉 함수가 어떻게 호출되었는지에 따라 동적으로 결정된다.
함수 호출 방식
1. 일반 함수 호출
2. 메서드 호출
3. 생성자 함수 호출
4. Fuction.prototype.apply/call/bind 메서드에 의한 간접 호출
일반 함수 호출
기본적으로 this에는 전역 객체가 바인딩된다.
(strict mode가 적용된 일반 함수 내부의 this에는 undefined가 바인딩됨.)

콜백 함수도 마찬가지로 일반함수로 호출되면 콜백 함수 내부의 this에도 전역 객체(window)가 바인딩된다.
따라서 this.value는 obj객체의 value 프로퍼티가 아닌 전역 객체의 value 프로퍼티, 즉 window.value를 참조(=1)한다.
메서드 내부의 중첩 함수나 콜백 함수의 this 바인딩을 메서드의 this 바인딩과 일치시키기 위한 방법은 다음과 같다.

위 방법 외에도 this를 명시적으로 바인딩할 수 있는
Function.prototype.apply, Function.prototype.call, Function.prototype.bind메서드가 있다.

또는 화살표 함수를 사용해서 this 바인딩을 일치시킬 수도 있다.
메서드 호출
메서드 내부의 this에는 메서드를 호출한 객체, 즉 메서드를 호출할 때 메서드 이름 앞의 마침표(.) 연산자 앞에 기술한 객체가 바인딩된다.

주의할 것은 메서드 내부의 this는 메서드를 소유한 객쳬가 아닌 메서드를 호출한 객체에 바인딩된다는 것이다.
person 객쳬의 getName 프로퍼티가 가리키는 함수 객체는 person 객체에 포함된 것이 아니라 독립적으로 존재하는 별도의 객체이며
따라서 getName 프로퍼티가 가리키는 함수 객체, 즉 getName 메서드는 다른 객체의 프로퍼티에 할당하는 것으로 다른 객체의 메서드가될수도 있고 일반 변수에 할당하여 일반함수로 호출될 수도 있다.

따라서 메서드 내부의 this는 프로퍼티로 메서드를 가리키고 있는 객체와는 관계가 없고 메서드를 호출한 객체에 바인딩된다.
생성자 함수 호출
생성자 함수 내부의 this에는 생성자 함수가 (미래에) 생성할 인스턴스가 바인딩된다.
Function.prototype.apply/call/bind 메서드에 의한 간접 호출
apply, call, bind 메서드는 Function.protytype의 메서드이므로 이들 메서드는 몯느 함수가 상속받아 사용할 수 있다.
apply, call 메서드는 this로 사용할 객체와 인수 리스트를 인수로 전달받아 함수로 호출한다.
apply와 call 메서드는 함수를 호출하면서 첫 번째 인수로 전달한 특정 객체를 호출한 함수의 this에 바인딩한다.
bind 메서드는 위 두 메서드와 달리 함수를 호출하지 않는다. 다만 첫 번째 인수로 전달한 값으로 this 바인딩이 교체된 함수를 새롭게 생성해 반환한다.

'스터디 > 모던 자바스크립트 Deep Dive' 카테고리의 다른 글
JS Deep Dive - 24. 클로저 (0) | 2024.05.22 |
---|---|
JS Deep Dive - 23. 실행 컨텍스트 (0) | 2024.05.22 |
JS Deep Dive - 21. 빌트인 객체 (0) | 2024.05.14 |
JS Deep Dive - 20. strict mode (0) | 2024.05.14 |
JS Deep Dive - 19. 프로토타입 (0) | 2024.05.10 |