On a couch

[코어자바스크립트] 02 실행컨텍스트 메모 본문

프론트엔드 공부/Javascript 읽기

[코어자바스크립트] 02 실행컨텍스트 메모

couch 2022. 8. 3. 00:20

Point 1

실행 컨텍스트 객체에는 3가지가 담긴다

1.  VariableEnvironment : 생성 당시의 모습

2. LexicalEnvironment : 생성 후의 변화 반영

3.  ThisBinding : this 식별자가 바라볼 객체

 

LexicalEnvironment는 두 가지 정보를 담는다.

(1) EnvironmentRecord : 현재 컨텍스트 내의 매개변수명, 변수의 식별자, 선언한 함수의 함수명 수집

    => 호이스팅과 연관됨

(2) outerEnvironmentReference : 상위 컨텍스트의 EnvironmentReconr

    => 스코프와 연관됨

 

Point 2

호이스팅이란 EnvironmentRecord가 식별자를 수집해 미리 알고 있는 것을 '끌어올린다고 표현'한 개념이다.

EnvironmentRecord에서는 현재 컨텍스트 내의 매개변수명을 먼저 수집하고, 이후에 내부에서 선언된 변수의 식별자, 함수의 함수명을 수집한다. (셋은 같은 이름으로 선언되면 override된다)

 

EnvironmentRecord는 '어떤 식별자가 있는지'에만 관심이 있고 '무엇이 할당되었는지'는 그때 가서 생각한다.

예외적으로 함수선언문은 (선언과 할당이 분리되어 있지 않으므로) 할당된 값의 정보까지 끌어올린다.

 

 

Point 3

스코프란 식별자에 대한 유효범위이다. ES5까지는 함수에 의해서만 스코프가 생성되었다.

스코프 체인이란 스코프를 현재 컨텍스트의 EnvironmentRecord에서부터 바깥(outerEnvironmentReference)으로 차례로 검색해나가는 것이다.

=> 동일한 식별자가 여러 스코프에서 선언되었다면 무조건 체인 상에서 가장 먼저 발견된 식별자에만 접근 가능하다.

이 때, 바깥 스코프에서 선언한 동일한 이름의 식별자에는 접근이 불가한 상황을 '변수 은닉화'라고 한다.

 


궁금한 점 : 클로저 함수에서 '외부 함수에서 선언된 변수는 함수 실행 후에도 메모리에 남아있다'라는 말이, '내부 함수가 남아있으므로 내부함수의 outerEnvironmentReference도 남아있어서'일까?