실행할 코드에 제공할 환경 정보들을 모아놓은 객체이다. 실행 컨텍스트 객체는 활성화되는 시점에 세 가지 정보를 수집한다.
① VariableEnvironment : 초기상태 유지
② LexicalEnvironment : 함수 실행 도중 변경되는 사항이 즉시 반영
③ ThisBinding
자바스크립트 엔진은 식별자들을 최상단으로 끌어올려놓은 다음 실제 코드를 실행하는데, 이를 호이스팅이라고 한다. 참고로, 변수를 호이스팅할 때 변수명만 끌어올리고 할당 과정은 원래 자리에 그대로 남겨둔다. 이 호이스팅된 식별자들은 EnvironmentRecord에 담긴다.
함수를 정의하는 방식은 세 가지가 있다.
function a () { ... } // 함수 선언문. 함수명 a가 곧 변수명 var b = function () { ... } // 함수 표현식. 변수명 b가 곧 함수명 var c = function d () { ... } // 기명 함수 표현식. 변수명은 c, 함수명은 d
이 중에서 함수 선언문과 함수 표현식을 자세히 보아야 한다.
위에서 호이스팅은 변수명만 끌어올리고 할당 과정은 제자리에 둔다고 했다.
그러나 함수 선언문은 작성된 함수 전체를 호이스팅한다. 이게 왜 위험하냐면, a함수 내용을 변경하면 a함수를 호출하는 모든 곳에 적용되기 때문이다.
반대로 함수 표현식은 변수명만 호이스팅되기 때문에, 함수 내용을 수정 후 호출하면, 수정 이후에 호출한 부분에서만 적용이 된다.
스코프란 변수의 유효범위를 말하는데, 전역변수, 지역변수를 생각하면 이해하기 쉽다.
outerEnvironmentReference는 해당 함수가 선언된 위치의 LexicalEnvironment를 참조한다. 현재 위치의 LexicalEnvironment를 탐색하고, 발견되는 것이 없다면 다음 LexicalEnvironment를 탐색하는 과정을 거친다.
전역 컨텍스트의 LexicalEnvironment까지 탐색해도 해당 변수를 찾지 못하면 undefined를 반환한다.