자바스크립트에서 실행 컨텍스트는 코드가 실행되는 환경 정보를 담은 상자입니다.
함수가 호출될 때마다 하나씩 생성되며, 안에는 VariableEnvironment, LexicalEnvironment, 그리고 this 바인딩 정보가 들어 있습니다.VariableEnvironment와 LexicalEnvironment는 모두 식별자(변수, 함수)를 저장하고 관리하는 공간입니다.
차이점은 시점에 있습니다.VariableEnvironment는 컨텍스트가 생성될 때 초기 상태를 저장하는 일종의 스냅샷 역할을 합니다.
주로var변수나 함수 선언이 이 단계에서 등록됩니다.반면 LexicalEnvironment는 코드가 실행될 때 참조되는 실제 환경으로,
let,const같은 블록 스코프 변수들이 이곳에 저장됩니다.
실행 중 새로운 블록이 열리면 LexicalEnvironment가 계속 쌓이며 스코프 체인을 형성하게 됩니다.이렇게 만들어진 스코프 체인은 현재 실행 중인 환경에서 식별자를 찾을 때,
현재 LexicalEnvironment, 외부 LexicalEnvironment, 전역 LexicalEnvironment 순으로 탐색하는 연결 구조입니다.
자바스크립트는 렉시컬 스코프(정적 스코프)를 사용하기 때문에, 함수가 어디서 정의되었는지에 따라 이 체인이 결정됩니다.마지막으로 this는 스코프 체인과는 별개로 동작합니다.
this는 함수가 어떻게 호출되었는지에 따라 런타임에 결정되며,
일반 함수 호출 시에는 전역 객체나undefined, 메서드 호출 시에는 점(.) 앞의 객체,new호출 시에는 새로 생성된 인스턴스를 가리킵니다.
단, 화살표 함수는 자신만의 this를 가지지 않고, 정의 당시 상위 스코프의 this를 그대로 상속받습니다.
var 선언은 undefined로 초기화, 함수 선언은 전체 함수 객체로 초기화된다.var 변수와 함수 선언이 이곳에 기록된다.var가 선언되면 아직 값이 할당되지 않아도 undefined로 미리 메모리에 등록된다.let, const, class 등이 이곳에 저장된다.{} 블록이나 함수가 생길 때마다 새로운 LE가 생성되어 쌓인다.let, const는 선언 전에 접근 시 ReferenceError가 발생한다.this는 스코프 체인과 별도로 존재하며, 함수가 어떻게 호출되었는지(호출 방식)에 따라 런타임에 결정된다.
호출 방식별 this 결정 규칙
| 호출 방식 | this 값 | 설명 |
|---|---|---|
| 일반 함수 호출 | 전역 객체(비엄격) / undefined(엄격) | 단순 호출 시 |
| 메서드 호출 | 점(.) 앞의 객체 | obj.method() 형태 |
생성자 호출(new) | 새로 생성된 인스턴스 | new 키워드 사용 시 |
| 명시적 바인딩 | 직접 지정한 객체 | call, apply, bind |
| 화살표 함수 | 상위 스코프의 this | 렉시컬 this 캡처 |
this 유지용으로 자주 사용된다.