Today I Learned

실행 컨텍스트

리꾸엘메 2022. 7. 21. 20:22

자바스크립트 엔진은 소스코드를 실행하기에 앞서 평가해, 실행에 필요한 정보를 수집한다.

실행 컨텍스트는 평가의 결과로 만들어지는 객체로, 스코프를 기준으로 각각의 실행 컨텍스트가 생성된다.

실행 컨텍스트는 식별자를 등록하고 관리하며, 스코프 체인을 형성하는 렉시컬 환경과

코드의 실행 순서를 결정하는 실행 컨텍스트 스택으로 구성된다.

실행 컨텍스트 스택

전역 코드 또는 함수 코드가 각각의 실행 컨텍스트를 생성하면 생성된 순서대로 스택에 쌓이게(push) 된다.

스택에 쌓인 순서로 코드를 실행하는 중 새로운 실행 컨텍스트가 생성되어 스택에 쌓이면

코드 실행을 일시정지하고 스택 최상위의 실행 컨텍스트에 해당하는 코드를 먼저 실행한다.

해당 범위의 코드가 끝나면 실행 컨텍스트는 스택에서 제거되어(pop) 사라진다.

언제나 가장 마지막에 쌓인 실행 컨텍스트의 순서로 실행되기 때문에

스택 최상위의 실행 컨텍스트는 항상 현재 실행중인 실행 컨텍스트가 된다.

const a = 1;				// 전역코드

function outerFunc () {		// outerFunc함수 코드
const b = 2;

function innerFunc () {		//innerFunc함수 코드
const c = 3;
console.log(a+b+c)
}

innerFunc();
}

outerFunc ();

1. 전역 코드의 평가 및 실행

전역 코드를 평가해 전역 실행 컨텍스트를 생성하고 스택에 쌓인다. 

전역 코드를 실행 중, outerFunc함수가 호출되면 전역 코드의 실행은 잠깐 중단된다.

 

2. outerFunc함수 코드의 평가 및 실행

outerFunc함수 내부의 코드를 평가해 함수 컨텍스트가 생성되고 스택에 쌓인다.

outerFunc함수 실행 컨텍스트가 스택 최상위에 있기 때문에 해당 코드를 먼저 실행한다.

실행 중 innerFunc함수가 호출되면 다시 코드 실행을 중단한다.

 

3. innerFunc함수 코드의 평가 및 실행

같은 원리로 innerFunc함수 실행 컨텍스트가 스택에 쌓이고, 해당 코드를 먼저 실행한다.

console.log를 마지막으로 innerFunc함수는 종료된다.

 

4. outerFunc함수 코드로 복귀

innerFunc함수 실행 컨텍스트가 스택에서 제거된다.

outerFunc함수 코드의 중단됐던 지점으로 돌아가 남은 코드를 실행한다.

실행할 코드가 없기 때문에 outerFunc함수는 종료된다.

 

5. 전역 코드로 복귀

outerFunc함수 실행 컨텍스트가 스택에서 제거된다.

전역 코드의 중단됐던 지점으로 돌아가 남은 코드를 실행한다.

실행할 코드가 없기 때문에 스택에 남은 전역 실행 컨텍스트도 제거되고, 스택에는 실행할 컨텍스트가 남지 않는다.

 

렉시컬 환경

렉시컬 환경은 실행 콘텍스트의 내용을 구성한다.

스코프에 포함된 식별자와 값을 관리하는 Environment Record(환경 레코드)와

해당 스코프의 상위 스코프인 Outer Lexical Environment Reference(외부 렉시컬 환경에 대한 참조)로 구성된다.

모던 자바스크립트 딥 다이브 23.5

Global Environment Record(전역 환경 레코드)

- 객체 환경 레코드: 전역 객체(var로 선언된 전역 변수, 전역함수, 표준 빌트인 객체, Web AIP 등)를 등록, 관리한다.

- 선언적 환경 레코드: let, const로 선언된 전역 변수를 등록, 관리한다. 

- this 바인딩: 전역 코드에서는 일반적으로 전역 객체가 바인딩된다.

 

Function Environment Record(함수 환경 레코드)

- 매개 변수, 함수 코드 안에서 선언된 지역 변수와 중첩 함수를 등록, 관리한다.

- this 바인딩: 함수 호출 방식에 따라 달라지는 this를 바인딩한다.

 

Outer Lexical Environment Reference(외부 렉시컬 환경에 대한 참조)

- 해당 코드가 평가되는 시점에서 실행 중인 실행 컨텍스트의 렉시컬 환경이 참조로 할당된다.

- 할당된 실행 컨텍스트의 스코프가 상위 스코프가 되며, 이를 바탕으로 스코프 체인이 형성된다.

- 전역 렉시컬 환경의 경우 참조할 렉시컬 환경이 없어 전역 스코프가 최상위 스코프가 된다.

 

블록 레벨 스코프에서의 선언적 환경 레코드

- let, const로 선언된 변수는 블록 레벨 스코프를 따르기 때문에, 전역 환경 레코드의 변수를 참조할 수 없다.

- 이 경우 블록 레벨 스코프 안에서 선언적 환경 레코드를 가진 렉시컬 환경을 다시 생성해 변수를 관리한다. 

'Today I Learned' 카테고리의 다른 글

이벤트 루프  (0) 2022.07.26
var, let, const  (0) 2022.07.19
스코프, 전역변수  (0) 2022.07.14
변수, 선언, 초기화, 할당 / 호이스팅  (0) 2022.07.12
타입스크립트 기본  (0) 2022.07.07