Ayden's journal

lexical scope vs lexical environment

렉시컬 스코프라는 단어를 처음 접했을 때, 나는 별 생각 없이 이것이 '렉시컬 환경에 따른 스코프 체인에 대한 것'이라고 생각했다. 때문에 모 회사의 면접에서 렉시컬 스코프를 설명하라는 질문에 부끄럽게도 스코프 체인에 대한 내용만 읊어버리고 말았다. 면접이 끝나고 이 두 개념이 다른 것이라는 말을 들었지만, 왜 다른 건지 뭐가 다른 건지 어떻게 다른 건지는 알 수 없었다. 이후 코어 자바스크립트와 YDKJSY를 읽으며 이 두 개념이 비슷하지만 확실히 다르다는 사실을 알게 되었다.

 

렉시컬 스코프는 변수와 함수가 어디에서 선언되었는지에 따라 그 유효 범위(scope)가 결정되는 원칙을 의미한다. 이는 정적으로 결정되며, 코드가 작성되는 위치에 따라 스코프가 결정된다. 즉, 함수가 어떤 코드 블록 내에서 선언되었는지에 따라 해당 함수가 접근할 수 있는 변수들이 정해지며, 실행 시점에 영향을 받지 않는다는 것이다. 때문에 실제로 렉시컬 스코프가 구성되는 시점은 컴파일 타임이다.

렉시컬 스코프는 변수를 찾을 위치를 정하는 규칙이라면, 렉시컬 환경은 그 변수가 실제로 어떤 값을 가지고 있는지 저장하고 관리하는 구조이다. 렉시컬 환경은 환경 레코드(Environment Record)를 사용하여, 해당 환경 내에서 변수와 함수 선언을 관리한다. 이를 통해, 변수를 찾는 방법과 실제 값을 저장하는 방식이 분리되어 효과적으로 작동하는 것이다. 렉시컬 환경은 렉시컬 스코프의 실체화된 형태라고 볼 수 있으며, 코드 실행 시점에서 변수의 값을 관리하는 핵심적인 역할을 맡는다.

이러한 관계에서 렉시컬 환경은 실행 컨텍스트가 생성될 때마다 실행될 코드에 따라 동적으로 생성되며, 스코프 체인(Scope Chain)을 통해 상위 실행 컨텍스트의 렉시컬 환경을 참조한다. 이 체인은 각 실행 컨텍스트가 자신이 속한 스코프 내에서 찾을 수 있는 변수들의 집합을 형성하고, 이를 바탕으로 변수를 올바르게 검색하고 값을 할당하는 과정을 지원한다.

 

한 줄로 요약하면 이렇다. 렉시컬 스코프는 컴파일 타임에 결정되는 변수의 유효 범위 규칙이며, 렉시컬 환경은 렉시컬 스코프를 기반으로 JS 엔진이 런타임에 변수를 관리하는 구체적인 매커니즘이다. 스코프 체인과 클로저는 렉시컬 스코프보다는 렉시컬 환경에 직접적인 영향을 받는다.

블로그의 정보

Ayden's journal

Beard Weard Ayden

활동하기