JavaScript

실행 컨텍스트

bas96 2021. 6. 21. 15:04

실행 컨텍스트

실행 컨텍스는 자바스크립트에서 가장 중요한 핵심 개념으로, 자바스크립트의 동적 언어로서의 성격을 잘 파악할 수 있는 개념입니다.

실행 컨텍스트는 실행할 코드에 제공할 환경 정보들을 모아둔 객체입니다.

 

동일한 환경에 있는 코드들을 실행할 때 필요한 환경 정보들을 모아 컨텍스트를 구성하고

-> 이를 콜 스택에 쌓아 올렸다가

-> 가장 위에 쌓여있는 컨텍스트롸 솬련있는 코드들을 실행합니다.

 

(여기서 동일한 환경은 하나의 실행 컨텍스트를 구성할 수 있는 방법으로, 함수를 실행하는 것)

 

위의 이미지와 함께 보면서 스택 구조를 생각해보면,

한 실행 컨텍스트가 콜 스택의 맨 위에 쌓이는 순간(4번째 컵), 즉 어떤 실행 컨텍스트가 활성화 되는 순간

자바스크립트 엔진은 해당 컨텍스트에 관련된 코드들을 실행하는데 필요한 환경 정보들을 수집해서 실행 컨텍스트 객체에 저장합니다.

여기에 담기는 정보들은 

VariableEnvironment (여기에 정보를 먼저 담고)

- environmentRecord (스냅샷: 최초 실행 시)

- outerEnvironmentReference (스냅샷)

LexicalEnvironment (VariableEnvironment 를 복사 ->LexicalEnvironment를 주로 활용)

- environmentRecord

- outerEnvironmentReference

 

environmentRecord

environmentRecord에는 현재 컨택스트와 코드의 식별자 정보들이 저장되는데, 그것들이 저정되는 방법은 전에 포스팅한 호이스팅의 개념으로 저장됩니다. 

식별자(컨텍스트를 구성하는 함수에 지정된 매개변수 식별자, 선언 함수가 있을 경우 그 함수 자체, var 로 선언된 변수의 식별자 등)

 

outerEnvironmentReference

스코프: 스코프는 위에서 말한 식별자에 대한 유효 범위입니다.

ES5까지는 전역 공간을 제외하면 오직 함수에 의해서만 스코프가 생성되었지만, ES6 부터는 블록에 의해서도 스코프 경계가 발생하게 되었습니다. 그러나 var로 선언한 변수에는 작용하지 않고, var로 선언한 변수는 스코프를 무시하는 문제점을 가지고 있습니다. ES6에서 새로 생긴 let, const, class, stric mode에서의 함수 선언 등에 대해서만 작용합니다.

 

이런 스코프를 안에서 바깥으로 차례대로 검색해 나가는 것을 스코프 체인이고, 이런 것을 가능하게 하는 것이outerEnvironmentReference 입니다. 

 

outerEnvironmentReference는 함수가 선언 될 당시의 LexicalEnvironment를 참조하는데, 

'선언 될 당시'란 콜스택 상에서 실행 컨텍스트가 활성화 된 상태를 말합니다.

 

선언 시점의LexicalEnvironment를 계속 거슬러 올라가면 마지막에는 전역 컨텍스트의 LexicalEnvironment가 있게 됩니다.