본문 바로가기

Javasciprt/Execution Context

Environment Record 맛보기 - Declarative Record

이 글은 ECMAScript 2021을 기준으로 만들어 졌습니다. 네. 2021이 오늘 나와서 그런지 2020이 증발했습니다 하하!

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


오랜만에 글을 쓴다. 쉬는 날이 많았는데... 게임이나 tv가 너무 재미있었다. 죄송합니다.

쨌든, 오늘은 Declarative Record의 함수들을 보면서 우리가 var, let등 변수들을 선언할 때, 어떤 식으로 선언 될지 한번 그림을 그려보고자 한다. 물론 함수나 모듈의 경우 세부 구현이 다르니 감안하고 참고하기 바란다.


Declarative Environment Record란

 간단히 말해서 선언해서 사용하는 것들의 record이다. 흔히 사용하는 let, var, function등의 키워드에 의해 선언되는 변수, 함수들은 이 record와 관련이 있다. 세부 구현으로 Function Environment Record와 Module Environment Record가 있다.

 

아래에서는 함수들을 대충 훑으면서 의문, 깨달음들을 공유하고자 한다. 여기서 밝히는 의문들을 가지고 위의 2가지 record를 포함한 나머지 record들을 살펴보면 매우 재미있을 것 같다. 의문은 요약 정리 아래에 연한 회색으로, 깨달음은 더 연한 회색으로 적어놓았다. 여기에서 소개할 대부분의 의문들은 다른 Environment Record를 소개하면서 해소할 생각이지만, 혹시 답답하면 먼저 읽어보는 것을 추천한다. 또 각 함수의 세부 알고리즘들을 보는 것도 이해에 도움이 되니 이와 별개로 한번 보는 것도 좋을 것 같다.

 

Function들

HasBinding( N )

N의 값이 record에 binding되어 있는지 여부를 리턴한다.

 

CreateMutableBinding( N, D )

N의 값을 식별자로 하는 uninitialized mutable binding을 하나 생성한다. 이때 N이 true면 이 binding이 삭제 될 것이라고 표시한다.

 

왜 삭제될 것임을 생성할 때 표시할까?

let, var등은 여기서 선언하겠구나.

선언시에 초기화 안할 경우 undefiend인 것은 이 함수 때문이구나.

 

CreateImmutableBinding ( N, S )

N의 값을 식별자로 하는 uninitialized immutable binding을 하나 생성한다. 이때 S가 true면 이 binding이 strict binding이라고 표시한다.

 

strict binding은 뭐지?

const와 같은 예약어는 여기서 정의 하겠구나?

 

InitializeBinding ( N, V )

record에 binding되어 있는 식별자(N의 값)에 V의 값을 bound한다. 이때 N이 record에 binding되어 있지 않으면 assert가 난다.

 

초기값 처리는 이 함수가 도맞겠군.

 

SetMutableBinding ( N, V, S )

record에 binding되어 있는 식별자(N의 값)에 V의 값을 bound한다. 이때 N이 record에 binding되어 있지 않고, S가 true이면 ReferenceError를 뱉고 파라미터를 이용해 생성 및 초기화를 시행한다. 거친다. 만약 binding이 Immutable binding이면 type error를 뱉는다.

 

var, let등의 변수에 새로 할당하는 등의 활용에서 같은 record상에서 동작을 한다는 가정하에는 새로 메모리를 할당하는게 아니라 식별자에  해당하는 메모리의 값만 바뀌겠구나. 반대로 record가 달라지는 환경일 경우 새로 생성하겠구나. 그러면 결과적으로 같은 이름을 가진 식별자가 다른 record에서는 충분히 존재할 수 있겠구나.

 

GetBindingValue ( N, S )

식별자(N의 값)에 binding되어 있는 value를 리턴한다. uninitialize되어 있으면 S의 값과 관계없이 Referenec error를 발생시킨다.

 

S는 과연 어디서 쓰길래 있을까?

 

DeleteBinding ( N )

위에서 삭제될 것이라고 명시된 식별자(N의 값)의 binding을 삭제하고 성공 여부를 리턴한다. 삭제에 대한 명시가 없으면 false를 리턴한다.

 

HasThisBinding ( )

보통의 Declarative record는 this를 지원 안하므로 false를 리턴한다.

 

왜 없을까 this.variable 등의 표현을 본 거 같은데?

 

HasSuperBinding ( )

보통의 Declarative record는 super를 지원 안하므로 false를 리턴한다.

 

class에서 상속받으면 super있지 않나? react에서 봤던거 같은데?

 

WithBaseObject ( )

withBaseObject에 대해서는 항상 undefined를 리턴한다.

 

withBaseObject?