[TIL] 렉시컬환경


사진 출처 : [10분 테코톡] 💙 하루의 실행 컨텍스트


렉시컬환경(Lexical environment,LE)

❗️ 스코프와 식별자와 식별자에 바인딩된 값을 관리한다 -> ER
❗️ 실행 컨텍스트를 구성하는 컴포넌트다
❗️ 상위스코프에 대한 참조를기록하는 자료구조 -> outerEnv


실행컨텍스트 에는!

Lexical Environment(LE)Variable Environment(VE) 두 가지 컴포넌트로 구성된다
그리고 이 컴포넌트들은 Enviroment Records(ER) 로 불리는 형태로 구성되어 있다
LE와 VE가 ER 자체를 바인딩하는 형태

LE

환경레코드(ER)외부 렉시컬 환경에 대한참조(Outer) 의 컴포넌트로구성된다

OuterEnv

상위 렉시컬 스코프에 대한 ER을 참조한다
상위스코프 : 해당 실행 컨텍스트를 생성한 소스코드를 포함하는 상위 코드의 렉시컬 환경


ER(전역환경레코드)

this에 대한 정보를 저장
식별자, 식별자의 값 저장
상위 ER에 대한참조 저장
OER(객체 환경레코드) 와 DER(선언적 환경레코드) 로 구성되어있다
ER의 OER 과 DER은 함께 서로 전역 스코프와 전역 객체를 관리한다

OER(객체 환경레코드)

var키워드로 선언한 전역 변수와 함수 선언문으로 만들어진 전역함수 등을 관리
식별자들에 대한 바인딩을 binding object로 가지고있는다
bingding object가 window로 접근하는 전역 객체

DER(선언적 환경레코드)

OER에서 바인딩 된걸 제외한 나머지 식별자들에 대한 바인딩을 저장
여기에 저장 된 건 전역 변수

GER

DER과 OER을 합성한 형태


lexical nesting strcure

스코프체인의 원리 :
실행 컨텍스트에서 코드가 실행될 때 현재 있는 ER에 식별자가 없다면 OUterEnv필드를 통해 식별자를 찾는 것

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


전역 레시컬환경은 스코프체인의 종점이므로 전역 렉시컬환경에서 검색할수 없는 식별자는 참조에러(레퍼런스에러)를 발생시킨다

스코프체인이라는 말은 ES3 이후로 명세에서는 사용하지 않는 용어다


렉시컬 스코프 (Lexical Scope)

스코프는 대부분 동적 스코프와 렉시컬 스코프 두개 방식이 있다.

동적 스코프는 런타임 중 함수의 호출에 의해 결정된다
js에서는 this 바인딩만 함수를 호출하는 방법에 따라 동적으로 달라진다

렉시컬스코프는 변수나 함수를 어디에 작성하였는가에 기초하여 결정된다
javascript 역시 렉시컬 스코프를 기반으로 동작하는 언어이다

좋은 웹페이지 즐겨찾기