본문 바로가기
자바스크립트

[자바스크립트] 렉시컬 환경 (Lexical Environment)

by 세바개님 2023. 3. 9.

자바스크립트에서 Lexical Environment는 변수, 함수 등의 식별자를 평가하고 참조할 때 사용되는 정보를 담고 있는 객체입니다. 이 객체는 실행 컨텍스트가 생성될 때 만들어지며, 해당 실행 컨텍스트에서 사용 가능한 변수와 함수 등의 식별자 정보를 저장하고 관리합니다.

 

1. 간단한 설명


Lexical Environment는 기본적으로 두 가지 정보를 포함하고 있습니다.

1) 환경 레코드(Environment Record)

 

현재 컨텍스트에서 선언된 변수, 함수 등의 정보를 담고 있습니다. 이 환경 레코드는 일반적으로 객체 형태로 구현되며, 변수 이름과 값, 함수 등을 저장합니다.

2) 외부 렉시컬 환경 참조(Outer Lexical Environment Reference)

 

현재 실행 컨텍스트가 참조하는 외부 실행 컨텍스트의 Lexical Environment를 가리킵니다. 이를 통해 변수의 스코프 체인(Scope Chain)을 형성하며, 상위 스코프에서 선언된 변수 등도 접근 가능합니다.

예를 들어, 다음과 같은 코드가 있다고 가정해봅시다.

 

function foo() {
  var x = 1;
  function bar() {
    console.log(x);
  }
  bar();
}
foo();


여기서 foo 함수의 실행 컨텍스트가 생성될 때, foo 함수의 Lexical Environment 객체가 만들어지고 그 안에는 다음과 같은 정보가 저장됩니다.

  • 환경 레코드(Environment Record) => x 변수와 bar 함수를 저장
  • 외부 렉시컬 환경 참조(Outer Lexical Environment Reference) => foo 함수가 선언된 전역 컨텍스트의 Lexical Environment를 참조

그리고 bar 함수의 실행 컨텍스트가 생성될 때, bar 함수의 Lexical Environment 객체가 만들어지고 그 안에는 다음과 같은 정보가 저장됩니다.

  • 환경 레코드(Environment Record) => 없음
  • 외부 렉시컬 환경 참조(Outer Lexical Environment Reference) => foo 함수의 Lexical Environment를 참조

bar 함수에서 x 변수를 참조할 때, 현재 실행 컨텍스트의 Lexical Environment에서 해당 변수를 찾을 수 없으므로, 상위 스코프인 foo 함수의 Lexical Environment로 이동하여 x 변수를 찾게 됩니다. 이처럼 Lexical Environment는 변수의 스코프 체인을 형성하고, 변수와 함수 등의 식별자를 관리하는 중요한 역할을 합니다.

 

2. 주의할 점

 

자바스크립트에서 Lexical Environment를 다룰 때 주의해야 할 몇 가지 사항이 있습니다.

 

  • 클로저(Closure)의 이해: 클로저는 함수와 함수가 선언된 Lexical Environment의 조합으로 만들어지는 개념입니다. 클로저를 이해하고 활용하는 것은 자바스크립트에서 중요한 개념 중 하나입니다.
  • 메모리 누수(Memory leak) 방지: Lexical Environment 객체는 실행 컨텍스트가 종료되면 가비지 컬렉터에 의해 수거되지만, 클로저를 사용하거나 중첩 함수 등을 사용하면 실행 컨텍스트가 종료되더라도 Lexical Environment 객체가 메모리에 계속 남을 수 있습니다. 이를 방지하기 위해서는 필요 없는 Lexical Environment 객체를 수동으로 제거해야 합니다.
  • 성능 이슈: Lexical Environment는 실행 컨텍스트 생성 시마다 새로 만들어지기 때문에, 변수와 함수 등을 참조할 때마다 Lexical Environment 객체를 검색해야 합니다. 이러한 검색 작업은 성능 저하를 일으킬 수 있으므로, 반복문 내부 등에서 변수와 함수를 참조하는 것은 지양해야 합니다.
  • 스코프 체인(Scope Chain)의 이해: Lexical Environment는 스코프 체인을 형성합니다. 이 스코프 체인은 변수나 함수 등을 참조할 때 사용되며, 상위 스코프에서 선언된 변수나 함수도 접근 가능합니다. 스코프 체인을 이해하지 못하면 변수나 함수 등을 참조할 때 예상치 못한 결과가 발생할 수 있으므로, 스코프 체인의 동작 원리를 숙지해야 합니다.
  • 호이스팅(Hoisting)의 이해: 자바스크립트에서 변수나 함수가 선언되기 전에 참조할 수 있는 현상을 호이스팅이라고 합니다. 호이스팅은 Lexical Environment의 동작 원리와 밀접한 관련이 있으며, 변수나 함수를 사용하기 전에 반드시 선언해야 한다는 규칙을 지켜야 합니다.


이러한 사항을 고려하여 Lexical Environment를 올바르게 이해하고 활용하는 것이 중요합니다.

댓글