[JSDD] this

지혜·2024년 8월 22일
0

CS

목록 보기
4/4

this 키워드

this : 자신이 속한 객체 또는 자신이 생성할 인스턴ㄴ스를 가리키는 자기 참조 변수.
-> 자신이 속한 객체 또는 자신이 생성할 인스턴스의 프로퍼티나 메서드를 참조할 수 있다.

this가 가리키는 값(바인딩) : 함수 호출 방식에 의해 동적으로 결정
-> 상황에 따라 가리키는 대상이 다르다.

바인딩이란? 식별자와 값을 연결하는 과정

+) 자바나 C++ 같은 클래스 기반 언어에서는 this는 언제나 클래스가 생성하는 인스턴스를 가르킨다.


함수 호출 방식과 this 바인딩

this 바인딩(this에 바인딩될 값)은 함수 호출 방식, 즉 함수가 어떻게 호출되었는지에 따라 동적으로 결정된다.

렉시컬 스코프 : 함수 객체가 생성되는 시점에 결정
this 바인딩 : 함수 호출 시점에 결정

1. 일반 함수 호출

  • 일반 함수로 호출된 모든 함수(중첩 함수, 콜백 함수 포함) 내부의 this에는 전역 객체가 바인딩 된다.
  • 메서드 내에서 정의한 중첩 함수도 일반 함수로 호출되면 전역 객체가 바인딩 된다.
  • 화살표 함수 내부의 this는 상위 스코프의 this를 가리킨다.

문제점 : 외부 함수인 메서드와 중첩 함수 또는 콜백 함수의 this가 일치하지 않기 때문에 헬퍼 함수로 동작하기 어렵게 만든다.

2. 메서드 호출

  • 메서드 내부의 this는 메서드를 호출한 객체에 바인딩 된다.
  • 메서드는 프로퍼티에 바인딩된 함수다. -> 독립적으로 존재하는 별도의 객체
  • 메서드는 다른 객체의 메서드가 될 수도 있고 (프로퍼티에 할당), 일반 변수로 호출될 수도 있다(일반 변수에 할당).

3. 생성자 함수 호출

  • 생성자 함수 내부의 this에는 생성자 함수가 (미래에) 생성할 인스턴스가 바인딩 된다.

생성자 함수 : 객체(인스턴스)를 생성하는 함수
new 연산자와 함께 호출 > 생성자 함수
new 연산자가 없다면 > 일반 함수

4. 간접 호출

applay, call, bind 메서드는 Function.prototype의 메서드이다. > 모든 함수가 상속 받아 사용할 수 있다.

applay, call : 함수를 호출
첫 번째 인수로 전달한 특정 객체를 호출한 함수의 this에 바인딩한다.

bind : 함수를 호출하지 않음
첫 번째 인수로 전달한 값으로 this 바인딩이 교체된 함수를 새롭게 생성해 반환한다.


정리

함수 호출 방식this 바인딩
일반 함수 호출전역 객체
메서드 호출메서드를 호출한 객체
생성자 함수 호출생성자 함수가 (미래에) 생성할 인스턴스
(apply, call, bind) 간접 호출메서드에 첫번째 인수로 전달한 객체

0개의 댓글