코어 자바스크립트 책을 읽고 배운 내용을 바탕으로 작성되었다.
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
키워드로 변수를 선언했다면, 참조 에러가 발생한다.