보통 실행컨텍스트를 구성할 수 있는 방법으로는 전역공간 , eval()함수, 함수 등이 있으나 보통 흔히 구성하는 방법은 함수를 실행시키는 것이다
우리가 사용하는 es6부터는 블록에 의해서도 실행컨텍스트가 생성이된다
실행 컨텍스트는 콜 스택에 쌓아 올려지고 위에 있는 컨텍스트와 관련있는 코드들을 실행하며 순서를 보장 받는다
이런 순서를 갖는 이유는 보다시피 스택구조는 그림처럼 출입구가 하나 뿐인 선입후출 구조이기 때문!
실행 컨텍스트에 담기는 정보들로는
현재 컨텍스트 내의 식별자들에 대한 정보와 외부 환경 정보가 담기는 VariableEnvironmnet와
VariableEnvironmnet와 같지만 변경사항이 실시간으로 반영되는 LexicalEnvironment
This 식별자가 바라봐야 할 대상 객체인 thisBinding로 구성돼있다.
실행 컨텍스트를 생성할 때 VariableEnvironmnet에 정보를 먼저 담은 다음 , 이를 그대로 복사해서 LexicalEnvironment 를 만들고 이후에는 LexicalEnvironment를 주로 활용을 한다
VariableEnvironmnet와 LexicalEnvironment 는 environmentRecord와 outerenvironmentReference로 구성돼있다.
environmentRecord는 현재 컨텍스트와 관련된 코드의 식별자 정보들을 처음부터 끝까지 쭉 스캔하며 순서대로 수집을 한다
여기서 식별자를 수집하는 과정이 우리가 알고 있는 호이스팅 개념인데, 실제로 자바스크립트 엔진이 식별자를 최상단으로 끌어올리지는 않지만 이 수집하는 과정을 이해하기 쉽게 하기 위해서
사용되는 가상의 개념이 호이스팅이다.
또 LexicalEnvironment 의 구성요소 중 하나인 outerenvironmentReference는 함수가 호출될 당시의 렉시컬 인바이러먼트를 정보를 담고 있는데 이 정보는 스코프 체이닝이 일어날 때 사용이 된다.
위 코드를 보면 outer에서 선언한 변수는 inner라는 함수에서도 접근이 가능하지만 inner에서 선언된 변수인 경기도는 오직 inner함수의 내부에서만 접근할 수 있다.
이 개념은 다들 아는 스코프 (식별자의 유효한 범위) 개념이다.
그리고 이렇게 outer에서 선언한 변수 ‘강’을 inner 함수에서도 접근이 가능하게 안에서부터 바깥으로 차례로 검색해 나가는 것을 스코프 체이닝이라고 한다.
그리고 이를 가능케 하는 것이 아까 말했던 LexicalEnvironment 의 구성요소 중 하나인 outerenvironmentReference이다
outerenvironmentReference는 함수가 호출될 당시의 LexicalEnvironment를 참조하기 때문이다.
이제 전체적인 실행 컨텍스트 과정을 코드와 함께 보자면
첫번째로 전역 컨텍스트가 활성화 되고 콜스택에는 전역 컨테스트가 쌓입니다 전역 컨텍스트의 environmentRecord에 {outer} 식별자를 지정한다.
전역 컨텍스트는 선언 시점이 없으므로 전역 컨텍스트의 outerenvironmentReference에는 아무것도 담기지 않는다.
Outer 함수가 실행이 되면 전역 컨텍스트의 코드는 임시 중단이 되고 outer 실행컨텍스트가 활성화 된다.
그러면 콜 스택 전역 컨텍스트 위에는 outer 컨텍스트가 쌓이고
outer 실행컨텍스트의 environmentRecord에는 {강 , inner} 식별자를 지정하고 outerenvironmentReference는 전역 컨텍스트의 LexicalEnvironment를 참조복사한다.
[GLOBAL, {outer}]이렇게 표기가 됩니다. 첫 번째는 실행 컨텍스트의 이름 , 두번째는 environmentRecord 객체입니다.
실행 컨텍스트가 생성 후 코드가 실행이 되며 강’ 이란 식별자에 인웅이 할당 된다.
그 후 inner함수를 호출하게 되고 inner 실행 컨텍스트가 활성화 됩니다. 마찬가지로 콜 스택에는 Outer 컨텍스트 위에 쌓이게 된다.
Inner 실행 컨텍스트의 environmentRecord에는 {경기도} 식별자를 지정하고 outerenvironmentReference는 outer 함수의 실행 컨텍스트가 담기게 된다.
컨텍스트 생성 후 코드가 실행이되며 그 다음 ‘강’이란 식별자에 접근을 해야 하는데 현재 활성화 상태인 inner 컨텍스트의 environmentRecord 내에는 없으므로 스코프 체이닝이 일어나 outer 함수의 렉시컬 인바이러먼트에 접근해서 검색을 한다.
‘강’이란 변수가 존재하니깐 발견 후 인웅을 출력해주고 그 다음 경기도에 접근을 한다.
현재 활성화 중인 inner 컨텍스트에서 ‘경기도’를 검색해주고 경기도가 있으니 할당값인 일산을 출력해준다.
inner함수 실행이 종료 되면 inner 실행 컨텍스트가 콜 스택에서 제거되고 outer 컨텍스트가 활성화 된다.
실행할 코드가 없는 outer 컨텍스트도 마찬가지로 콜 스택에서 제거 되고 마지막으로 전역 컨텍스트가 활성화되는데 더이상 진행할 코드가 없으므로 콜 스택에서 제거 되며 종료가 된다.
최종정리를 하자면
실행 컨텍스트
란 실행할 코드에 제공할 환경 정보를 모아놓은 객체이며
실행 컨텍스트는 variable environment, lexical environment, thisbinding 3가지로 구성돼있으며
Lexical environment와 variable environment는 environmentRecord 와 outerEnvironmentReference로 구성돼있다.
environmentRecord를 쉽게 이해시키기 위한 개념으로는 선언부를 스코프내의 최상단으로 끌어올리는 호이스팅이 있고
내부함수에서 외부함수로 바깥으로 차례로 검색해 나가는 과정을 스코프 체이닝이라고 하며 이 과정을 거치기 위해 참조하는 것이 outerEnvironmentReference이다.