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가 바인딩된다.