this는 자기 참조 변수로, 본인을 호출한 함수(객체)에 의해 동적으로 결정된다.
즉, 런타임에 만들어진다.

일반 함수

함수 선언문을 사용했지만 함수 표현식도 같은 결과로 나온다.

foo()와 boo() 는 생략되었지만 앞에 window라는 전역 객체가 붙는다.
따라서 이 두 함수를 호출하는 객체가 window이므로 this는 window와 바인딩된다.

메서드

this 바인딩은 함수 렉시컬 환경에 [[ This ]] 내부 슬롯이 존재해야 이뤄진다.

  • 화살표 함수
    x는 함수 렉시컬 환경에 [[ This ]] 내부 슬롯이 존재하지 않는다.
    따라서, 스코프 체인을 통해 전역 렉시컬 환경에서 [[ This ]]를 찾는다.
    (객체는 실행 컨텍스트가 존재하지 않는다.)
    전역 렉시컬 환경에서의 [[ This ]]는 window 객체를 가리킨다.

  • 축약된 메서드, 일반 메서드
    y와 z는 함수 렉시컬 환경에 [[ This ]] 내부 슬롯이 존재한다.
    따라서, test 객체와 this가 바인딩된다.

클래스

클래스는 생성자 함수의 문법적 설탕이다.
자세한 내용은 다른 포스팅에서 설명하겠다.

  • constructor
    인스턴스를 만들면 가장 먼저 실행되는 함수다.
    this는 인스턴스와 바인딩된다.

  • 화살표 함수
    x는 함수 렉시컬 환경에 [[ This ]] 내부 슬롯이 존재하지 않는다.
    따라서, 스코프 체인을 통해 constructor 렉시컬 환경에서 [[ This ]]를 찾는다.
    constructor 렉시컬 환경에서의 [[ This ]]는 인스턴스를 가리킨다.

  • 축약된 메서드, 일반 메서드
    y와 z는 함수 렉시컬 환경에 [[ This ]] 내부 슬롯이 존재한다.
    따라서, 인스턴스와 this가 바인딩된다.

profile
Software Engineer

0개의 댓글