Solog
렉시컬 환경

렉시컬 환경

2023년 11월 14일

javascript

렉시컬 환경

자바스크립트 엔진은 코드를 실행하기 전에 렉시컬 환경이라는 자료구조를 생성한다.

변수가 선언될 때 변수 식별자는 렉시컬 환경에 키로 등록되고,

변수에 값이 할당될 때 렉시컬 환경의 변수 식별자의 해당하는 값이 변경된다.

변수의 검색도 이 렉시컬 환경에서 이루어진다.

렉시컬 환경은 2가지로 나뉜다.

  • 환경 레코드 Environment Record
    • 모든 지역 변수들을 Property로 가지는 객체
    • 위에서 언급한 변수 식별자를 등록하는 곳이다.
  • 외부 코드와 외부 렉시컬 환경에 대한 참조 OuterLexicalEnvironmentReference

렉시컬 환경의 작동 방식

위에서 말한 것처럼 렉시컬 환경은 변수를 환경 레코드에 등록하는데,

저장하는 방식은 변수 또는 함수 선언 방식에 따라 달라진다.

  • 변수
    • var 로 선언된 경우
      • var 로 선언된 변수는 변수명을 키(key)로, undefined 를 값(value)으로 초기화한다.

        이로 인해 호이스팅이라 불리는 변수 선언이 끌어 올려진 것처럼 보이는 것이 가능하다.

        변수가 선언되기 전에 참조되었음에도 불구하고 Reference Error 가 발생하지 않고, undefined 값을 얻을 수 있기 때문이다.
    • let 이나 const 로 선언된 경우
      • let이나 const 로 선언된 변수는 변수명을 키(key)로, <uninitialized> 라는 상태를 값(value)으로 초기화한다.

        undefined 와 다르게 이 값은 참조를 할 수 없기 때문에 선언하기 전에 참조를 하려 하면 Reference Error 가 발생하는 것이다.

        이처럼 변수가 선언되기 전에 참조할 수 없는 경우를 TDZ (Temporary Dead Zone) 이라 하기도 한다.
  • 함수
    • 함수 선언식
      • 함수가 선언식으로 선언되면 함수명을 키(key)로 함수 자체를 값(value)로 저장하기 때문에 완전히 초기화되고,
        이 덕분에 스코프 최하단에 선언되어 있어도 선언되는 줄 이전에 접근이 가능하다.
    • 함수 표현식
      • 함수가 표현식으로 선언된 경우 익명 함수를 저장하는 변수의 선언자에 따라간다.

외부 렉시컬 환경

코드를 실행할 때 참조할 변수를 현재 스코프와 연결되어 있는 환경 스코프를 먼저 찾아서, 그 안에 참조할 변수가 있는지 확인한다.

만약 참조할 변수가 존재하지 않는 경우 상위 스코프로 올라가서 해당 상위 스코프와 연결된 환경 스코프를 찾아 참조할 변수를 찾는다.

이 작업을 계속 반복하여 전역 스코프까지 올라가면서 참조할 변수를 찾는데,
전역 변수에도 참조하고자 하는 변수가 존재하지 않는다면, Reference Error 가 발생한다.

이전 아티클

스코프 체인

다음 아티클

렉시컬 스코프