본문 바로가기

Javasciprt/Execution Context

Environment Record - 맛보기 + 2017과 2020 비교 한스푼

이 글은 ECMAScript2017과 ECMAscript 2020을 기준으로 작성된 글입니다. 

오타, 오역, 부정확한 표현/정보가 있으면 지적해 주시면 감사하겠습니다.

 


드디어 Lexical Environment에서 한 발짝을 때 본다. 이번 글에서는 Environment Record가 뭐고, 어떤 게 있는지에 대해서 간략히 알아보고자 한다. 각 종류에 대한 세부 설명은 몇 편에 걸쳐서 소개되지 않을까 싶다. (물론 연휴에 올릴 것 같다 )


Environment Record

 

지난 번에는 Environment Record의 정의를 살펴봤다. 아래 정의를 한번 보자.

 

An Environment Record is a specification type used to define the association of Identifiers to specific variables and functions, based upon the lexical nesting structure of ECMAScript code

Environment Record는 ECMAScript코드의 lexical nesting structure에 따라 함수, 변수들에 식별자를 연관시키는 특정한 타입이다.

뭔가 달라졌지 않은가? 2020과 2017을 우연한 기회에 같이 보다 보니 2020에서는 기존에 Lexical Envrionment에서 핵심이라고 할 수 있는 Environment Record로 개념이 대체된 듯 보인다. 예를 들어, 2020에서는 각각의 Environment Record가 [[OuterEnv]]라는 속성을 지녀, 기존 Lexical Environment의 outer Lexical Environment개념을 대체한다.

- 물론 Lexical Environment는 명세에서 찾아보면 여전히 존재 하므로 같은 맥락으로 이해하면 좋다.

 

 어쨌건 2017과 2020에서 Environment Record의 Type hierarchy는 변화하지 않았다.

Environment Record의 Type Hierachy는 크게 아래 3개가 있으며

 

  • Declarative Environment Record
  • Object Envrionment Record
  • Global Environment Record

Declarative Environment Record하위에 아래 2개가 있다.

 

  • Function Environment Record
  • Module Environment Record

각각을 조금 살펴보면 다음과 같은 내용을 가지고 있다.(간단하게 표현하였다)

 

Declarative Environment Record

 ECMAScript에서 함수나 변수가 정의되기위해서 혹은 정의될 때 가지는 데이터들에 대응하는 binding을 가지고 있는 Environment Record이다. 이것은 바로 아래 2개의 subclass를 가진다.

Function Environment Record

 ECMAScript의 function object를 호출하는 것에 대응된다. 조건부로 this에 대한 binding을 지원하고, super를 지원하기 위해 필요한 정보들을 가진다.

 

 Function Environment Record는 function안에서 top-level declaration에 대한 binding도 포함한다. (2020)

Module Environemnt Record

 Top-level Module에 대한 binding 뿐만 아니라 외부에서 도입한(import된) 모듈에 대한 binding을 가진다.

 

 이것의 [[outerEnv]]는 global Environment Record이다.(2020)

Object Environment Record

 Object의 properies의 식별자binding을 위해 사용되는 Environment Record이다.

Global Environment Record

 Script의 global declaration을 위해 사용된다. 간단히 전역으로 우리의 코드를 정의하기 위해 사용하는 Record이다. 이것은 식별자 binding을 가지고 있을 수 있고, 또 Global Environment Record에 일부 식별자 binding을 제공하는 Global Object도 포함한다.

 

 이것의 [[outerEnv]]의 값은 null이다. (2020)


 아마 읽으면서 지난 Lexical Environment의 종류에서 다루었던 Function, Moudle, global Lexical Environment의 설명이, 이름이 대응되는 Environment Record들의 설명과 상당히 일치한다는 것을 알아챈 독자도 있을 것이다. 다른 것은 기존에는 outer라는 말을 사용했다면, 지금은 [[outerEnv]] 라는 용어를 사용한다는 것뿐, 거의 동일하게 소개한다. 굉장히 흥미롭게 읽었다.

 


 실은 2017 사이트가 너무 느려서 2020을 봤던 것인데, 쓰려고 다시 읽다 보니 뭔가 달라서 깜짝 놀라 천천히 다시 읽어 내려갔다. 확실히 이전에 closure에 대한 정리 글을 쓸 때에도 Lexical Environment의 정의가 애매해서 애를 먹었었다. 나는 바뀌어서 좋은 것 같다.

 

 이제부터는 2020과 2017을 병행해서 볼 것 같다. 먼저 2017을 읽고, 2020에서 변화된 점이 없나 찾아볼 예정이다. core 한 개념이라 바뀌는 게 없을 줄 알았는데, 휙휙 바뀌는 것을 알게 되어 javascript 하면 매년 이걸 정리해야 하나 싶은 생각이 들어서 조금 무서워졌다. 여하튼 굉장히 재미있었기에 다음 포스트도 비슷한 맥락으로 가지 않을까 싶다.

 

참조

ECMAScript 2020 - https://tc39.es/ecma262/

ECMAScript 2017 - https://www.ecma-international.org/ecma-262/8.0/index.html

 

혹시 abstract class를 모르겠다면 아래 블로그를 찾아봐라. 동갑인데 갓갓인 분이다. 진짜 멋있는 사람인 것 같다.

ES6와 함께 JavaScript로 OOP하기 - https://parksb.github.io/article/1.html

 

'Javasciprt > Execution Context' 카테고리의 다른 글

Environment Record 맛보기 - Declarative Record  (0) 2020.05.26
Lexical Environment 종류  (0) 2020.04.23
Lexical Environment 맛보기  (1) 2020.04.22