식별자의 유효범위를 안에서부터 바깥으로 차례대로 검색해나가는 것을 말한다.
이것을 가능하게 하는 것이 바로 LexicalEnvironment의 두 번째 수집 자료인 outerEnvironmentReference이다.
outerEnvironmentReference는 현재 호출된 함수가 선언될 당시
의 LexicalEnvironment를 참조한다.
예를 들어, A함수 내부에 B함수, 다시 B함수 내부에 C함수를 선언한 경우를 가정한다.
C함수의 outerEnvironmentReference는 B함수의 LexicalEnvironment를 참조한다.
그리고 B함수의 outerEnvironmentReference는 A함수의 LexicalEnvironment를 참조한다.
A함수는 전역 컨텍스트의 LexicalEnvironment를 참조하게 된다.
이와 같은 구조적 특성 때문에 가장 가까운 요소부터 차례대로만 접근할 수 있고, 다른 순서로의 접근은 불가능하다.
또, 여러 스코프에서 동일한 식별자를 선언한다고 해도 무조건 스코프 체인 상에서 가장 먼저 발견된 식별자에만 접근이 가능하다.
this
실행 컨텍스트의 thisBinding에는 this로 지저된 객체가 저자된다.
실행 컨텍스트 활성화 당시에 this가 지정되지 않은 경우에는 전역 객체가 저자된다.
그 외에는 함수를 호출하는 방법에 따라 this에 저장되는 대상이 달라진다.
정리
실행 컨텍스트는 실행할 코드에 제공할 환경 정보들을 모아놓은 객체이다.
실행 컨텍스트는 전역 공간에서 자동으로 생성되는 전역 컨텍스트, eval 및 함수 실행에 의한 컨텍스트 등이 있다.
실행 컨텍스트 객체는 활성화되는 시점에 VariableEnvironment, LexicalEnvironment, ThisBinding의 세 가지 정보를 수집한다.
실행 컨텍스트를 생성하는 시점에는 VariableEnvironment와 LexicalEnvironment가 동일한 내용으로 구성되지만, LexicalEnvironment는 함수 실행 도중에 변경되는 사항이 즉시 반영되는 반면 VariableEnvironment는 초기 상태를 유지한다.
VariableEnvironment와 LexicalEnvironment는 매개변수명, 변수의 식별자, 선언한 함수의 함수명 등을 수집하는 environmentRecord와 바로 직전 컨텍스트의 LexicalEnvironment 정보를 참조하는 outerEnvironment로 구성되어 있다.
호이스팅은 코드 해석을 수월하게 하기 위해 environmentRecord의 수집 과정을 추상화한 개념이다.
실제로 코드를 최상단으로 '끌어올리는' 과정은 아니다.
변수 선언과 값 할당이 동시에 이루어진 문장은 '선언부'만을 호이스팅하고 할당 과정은 원래 자리에 남게 된다.
이 과정에서 함수 선언문과 함수 표현식의 차이가 발생하는 것이다.
스코프는 변수의 유효 범위이다.
outerEnvironmentReference는 해당 함수가 선언된 위치의 LexicalEnvironment를 참조한다.
코드 상에서 어떤 변수에 접근하려고 할 때, 단계적으로 스코프를 넓혀가며 LexicalEnvironment를 탐색한다.
변수가 발견되면 그 값을, 전역 컨텍스트의 LexicalEnvironment까지 탐색해도 변수를 찾지 못한 경우 undefined를 반환한다.
this에는 실행 컨텍스트를 활성화하는 당시에 지정된 this가 저장된다.
함수를 호출하는 방법에 따라 그 값이 달라지고, 지정되지 않은 경우에는 전역 객체가 저장된다.