
코어 자바스크립트 책을 읽고 배운 내용을 바탕으로 작성되었다.
Lexical Environment를 갖는다.environmentRecord가 있으며, 컨텍스트 내부 코드를 처음부터 끝까지 훑으며 식별자들의 정보(변수명, 함수명)들을 순서대로 수집하여 environmentRecord에 저장된다.Hoisting이 일어난다.var, let, const 총 3가지 키워드 중 하나로 선언될 수 있다.undefined를 할당하여 초기화한다.let과 const으로 선언된 변수도 선언부와 할당부로 나누어 선언부만 해당 스코프의 선두로 끌어올리지만, var로 선언된 변수와 달리 undefined로 값이 초기화되지 않는다. 만약 변수에 값을 할당하기 전에 접근하면 참조 에러가 뜬다.let이나 const 키워드로 선언된 변수는 변수가 선언된 시점부터 초기화되기 전까지 변수를 참조할 수 없는 TDZ(Temporal Dead Zone, 일시적 사각 지대)에 있게 된다.var 키워드로 변수를 선언했다면 변수의 선언문이 해당 스코프 최상단으로 끌어올려지고 undefined로 초기화된다. 만약 함수 표현식이 정의되기 이전에 함수를 호출한다면, 해당 함수는 함수명이 아닌 undefined으로 초기화된 변수로 인식하게 되어 타입 에러가 발생한다.let이나 const 키워드로 변수를 선언했다면, 참조 에러가 발생한다.