동적으로 결정되는 this 바인딩
자바나 C++ 같은 클래스 기반 언어와 다르게 자바스크립트는 함수 호출 방식에 따라 this 바인딩이 결정됩니다. 그렇기 때문에 this 바인딩이 되는 상황을 알기 위해서는 다양한 방식의 함수 호출 방식을 먼저 알아야 합니다.
아 다르고 어 다르다!
자바스크립트는 다양한 방식으로 함수 호출이 가능합니다. 하지만 주의해야할 점은, 동일한 함수를 다른 방식으로 호출이 가능하다는 것입니다. 즉 같은 함수라도 다르게 호출된다면 하는 역할이 달라지게 됩니다. 같은 말이라도 아 다르고 어 다르게 될 수 있으니 주의하셔야 합니다.
함수 호출 방식과 this 바인딩
이제 다양한 자바스크립트의 함수 호출 방식에 대해서 알아보고 이때의 this 는 어떻게 바인딩 되는지에 대해서 알아보겠습니다. 크게 4 가지의 호출 방식에 대해서 알아보고 이때의 this 는 어디로 바인딩 되는지 정리해보자 합니다.
1. 일반 함수 호출
만약 함수가 일반 함수로 호출된다면, this 는 전역 객체(global object)가 바인딩 되게 됩니다.
하지만 strcit mode 가 적용된 함수 내의 this 는 undefined 가 바인딩되게 됩니다.
그 이유는 사실 this 는 객체의 프로퍼티, 메서드를 참조하기 위한 자기 참조 변수이기 때문입니다. 즉 일반 함수에서의 this 는 아무런 의미가 없다고 볼 수 있습니다.
2. 메서드 호출
함수가 메서드로 호출되면 메서드를 호출한 객체, 즉 메서드 호출시 메서드 이름 앞 마침표 연산자 앞의 객체에 this 가 바인딩 됩니다.
주의해야 할 점은 메서드는 프로퍼티에 바인딩되어 있는 함수입니다. 즉 독립적으로 존재하는 별도의 객체로서 위 코드의 person 객체가 소유하고 있는, 즉 포함되어 있지 않습니다.
따라서 아래와 같이 다른 객체의 프로퍼티에 할당하는 것이 가능합니다. 이를 통해 다른 객체의 메서드가 되는 것 뿐만 아니라 일반 변수에 할당해 일반 함수로 사용하는 것 또한 가능합니다.
3. 생성자 함수 호출
생성자 함수 내부의 this 는 미래 생성될 인스턴스가 바인딩 됩니다. 생성자 함수는 말 그대로 객체를 생성하는 함수입니다.
4. Function.prototype.apply/call/bind 메서드에 의한 간접 호출
apply, call, bind 메서드는 모든 함수가 상속받아 사용하는 것이 가능합니다. 이 메서드들은 모두 Function.prototype 의 메서드이기 때문입니다.
여기서의 this 바인딩은 각 메서드들에 첫 번째 인수로 전달한 객체를 가리킵니다. 보다 더 자세한 내용은 아래에서 확인 하실 수 있습니다.
- 정리 링크 -
'자바스크립트 > 자바스크립트 정리' 카테고리의 다른 글
호이스팅은 var 에서만 일어난다구요? (0) | 2021.07.18 |
---|---|
(충격) 클로저는 사실 최약체다? (0) | 2021.06.27 |
[자바스크립트] Set (집합) (1) | 2021.06.06 |
[자바스크립트] 디스트럭처링 할당 (0) | 2021.06.06 |
[자바스크립트] 스프레드 문법 (0) | 2021.06.06 |