코어 자바스크립트 책을 읽고 배운 내용을 바탕으로 작성되었다.
Execution context
VariableEnvironment
(변수 객체), LexicalEnvironment
(렉시컬 환경), ThisBinding
으로 구성된다.LexicalEnvironment
(렉시컬 환경)와 동일한 내용으로 구성되어 있지만, 함수 실행 도중 변경사항이 생길 때에는 렉시컬 환경에만 반영한다.VariableEnvironment
(변수 객체)는 초기 상태를 유지한다.Lexical Environment
은 특정 코드가 작성, 선언된 환경이다.environmentRecord
와 outerEnvironmentReference
로 구성되어 있다.environmentRecord
에는 현재 컨텍스트와 관련된 코드의 식별자 정보들이 저장된다. 매개변수명, 변수의 식별자, 선언한 함수의 함수명 등이 있다.Hoisting
이 발생한다.
Hoisting
- 호이스팅은 environmentRecord의 수집과정을 추상화한 개념이다.
- 변수 선언문이나 함수 선언문이 해당 스코프의 최상단으로 옮겨진 것처럼 동작하는 특성을 말한다.
- 이때 변수는 선언부와 할당부를 나누어 선언부만 끌어올리는 반면, 함수 선언은 함수 전체를 끌어올린다.
- 함수 선언문의 경우 함수 전체를 끌어올리지만, 함수 표현식에는 변수 호이스팅이 일어난다.
outerEnvironmentReference
는 현재 호출된 함수가 선언된 당시의 Lexical Environment
를 참조한다.LexicalEnvrinonemt
를 탐색해서 발견되면 그 값을 반환하고, 발견하지 못하면 outerEnvironmentReference
에 담긴 LexicalEnvironment
를 탐색하는 과정을 거친다. 계속 찾지 못할 경우 전역 컨텍스트의 LexicalEnvironment
까지 탐색해 나가며 해당 변수의 스코프 체인을 따라 탐색한다.thisBinding
에는 this로 지정된 객체가 저장된다.