렉시컬 환경 (Lexical Environment)

김기훈·2023년 2월 21일
0

자바스크립트

목록 보기
2/17

렉시컬 환경

코드 블록, 함수, 스크립트를 실행하기 앞서 실행할 스코프 범위 안에 있는 변수와 함수를 프로퍼티와 메서드로 저장하는 자료구조이며 실행 컨텍스트를 구성하는 컴포넌트다.

간단히 말하면, 렉시컬 환경은 생성자-변수 매핑을 보유한 구조이다.
실행 컨텍스트 스택이 코드의 실행 순서를 관리한다면 렉시컬 환경은 스코프와 식별자를 관리한다.

실행 컨텍스트(Execution Context)
JavaScript 코드 블록이 평가 및 실행되는 환경의 추상적인 개념이다.

실행 컨텍스트 스택
자바스크립트 엔진이 작성된 스크립트를 처음 마주할 때, 전역 실행 컨텍스트를 생성하고, 현재 실행 스택에 push 한다. 엔진이 함수 호출을 발견 할 때마다, 함수를 위한 새로운 실행 컨텍스트를 생성하고 스택의 꼭대기에 push 한다.
엔진은 스택 최상단에 있는 함수의 실행 컨텍스트를 실행한다. 이 함수가 완료되면 해당 함수의 실행 스택이 현 스택에서 pop 되고 그 아래 실행 컨텍스트에 도달한다.
이처럼 실행 컨텍스트 스택코드의 실행 순서를 관리한다.


함수는 선언이 아닌 실행될 때 렉시컬 환경을 구성한다.

  • 함수 호출을 변수에 할당한 후 호출시 하나의 렉시컬 환경이 만들어 지며 같은 외부 렉시컬 환경을 참조한다. 하지만 변수에 저장해두지 않고 같은 함수를 호출할 시 고유 렉시컬 환경으로 호출한 수 만큼의 렉시컬 환경이 생성되고 각각 서로다른 외부 렉시컬 환경을 참조한다.
function makeCounter() {
  let count = 0;

  return function() {
    return count++;
  };
}

let counter = makeCounter();
console.log(counter()); // 0
console.log(counter()); // 1
console.log(counter()); // 2

console.log(makeConter()()); // 0
console.log(makeConter()()); // 0
console.log(makeConter()()); // 0

렉시컬 환경 컴포넌트

1. 환경 레코드

스코프에 포함된 식별자를 등록하고 식별자에 바인딩 된 값(변수,함수)을 관리하는 저장소

1) 렉시컬 환경 레코드

이름에서 알수 있듯, 변수와 함수 선언 저장을 뜻한다. 함수 코드를 위한 렉시컬 환경은 렉시컬 환경 레코드를 포함한다.

2) 객체 환경 레코드

전변수, 함수 선언과 별개로, 객체 환경 레코드는 전역 바인딩 객체(브라우저의 window 객체)를 저장한다. 그래서 각 바인딩 객체의 프로퍼티에 대해 레코드에 새로운 항목이 생성된다.

2. 외부 렉시컬 환경에 대한 잠조

상위 스코프를 가리킨다. 이때 상위 스코프란 외부 렉시컬 환경, 즉 실행 컨텍스트를 생성한 소스코드를 포함하는 상위 코드의 렉시컬 환경을 말한다. 이를 통해 단방향 링크드 리스트인 스코프체인을 구현한다.


This 바인딩

1. 전역 실행 컨텍스트

this의 값은 전역 객체를 참조한다.

2. 함수 실행 컨텍스트

this의 값은 함수가 어떻게 호출되는지에 달렸다.
만약 객체 참조로부터 호출되면, this의 값은 해당 객체로 set 되고,
그렇지않을 경우 전역 객체 또는 undefined(strict 모드)로 set 된다.

profile
평생 공부하기

0개의 댓글

관련 채용 정보