
렉시컬 환경
2023년 11월 14일
javascript
렉시컬 환경
자바스크립트 엔진은 코드를 실행하기 전에 렉시컬 환경이라는 자료구조를 생성한다.
변수가 선언될 때 변수 식별자는 렉시컬 환경에 키로 등록되고,
변수에 값이 할당될 때 렉시컬 환경의 변수 식별자의 해당하는 값이 변경된다.
변수의 검색도 이 렉시컬 환경에서 이루어진다.
렉시컬 환경은 2가지로 나뉜다.
- 환경 레코드 Environment Record
- 모든 지역 변수들을 Property로 가지는 객체
- 위에서 언급한 변수 식별자를 등록하는 곳이다.
- 외부 코드와 외부 렉시컬 환경에 대한 참조 OuterLexicalEnvironmentReference
렉시컬 환경의 작동 방식
위에서 말한 것처럼 렉시컬 환경은 변수를 환경 레코드에 등록하는데,
저장하는 방식은 변수 또는 함수 선언 방식에 따라 달라진다.
- 변수
- var 로 선언된 경우
- var 로 선언된 변수는 변수명을 키(key)로,
undefined
를 값(value)으로 초기화한다.
이로 인해 호이스팅이라 불리는 변수 선언이 끌어 올려진 것처럼 보이는 것이 가능하다.
변수가 선언되기 전에 참조되었음에도 불구하고Reference Error
가 발생하지 않고,undefined
값을 얻을 수 있기 때문이다.
- var 로 선언된 변수는 변수명을 키(key)로,
- let 이나 const 로 선언된 경우
- let이나 const 로 선언된 변수는 변수명을 키(key)로,
<uninitialized>
라는 상태를 값(value)으로 초기화한다.
undefined
와 다르게 이 값은 참조를 할 수 없기 때문에 선언하기 전에 참조를 하려 하면Reference Error
가 발생하는 것이다.
이처럼 변수가 선언되기 전에 참조할 수 없는 경우를TDZ (Temporary Dead Zone)
이라 하기도 한다.
- let이나 const 로 선언된 변수는 변수명을 키(key)로,
- var 로 선언된 경우
- 함수
- 함수 선언식
- 함수가 선언식으로 선언되면 함수명을 키(key)로 함수 자체를 값(value)로 저장하기 때문에 완전히 초기화되고,
이 덕분에 스코프 최하단에 선언되어 있어도 선언되는 줄 이전에 접근이 가능하다.
- 함수가 선언식으로 선언되면 함수명을 키(key)로 함수 자체를 값(value)로 저장하기 때문에 완전히 초기화되고,
- 함수 표현식
-
함수가 표현식으로 선언된 경우 익명 함수를 저장하는 변수의 선언자에 따라간다.
-
- 함수 선언식
외부 렉시컬 환경
코드를 실행할 때 참조할 변수를 현재 스코프와 연결되어 있는 환경 스코프를 먼저 찾아서, 그 안에 참조할 변수가 있는지 확인한다.
만약 참조할 변수가 존재하지 않는 경우 상위 스코프로 올라가서 해당 상위 스코프와 연결된 환경 스코프를 찾아 참조할 변수를 찾는다.
이 작업을 계속 반복하여 전역 스코프까지 올라가면서 참조할 변수를 찾는데,
전역 변수에도 참조하고자 하는 변수가 존재하지 않는다면, Reference Error
가 발생한다.