해당 글은 정재남 님의 '코어자바스크립트' 책을 읽고 공부한 포스팅입니다.
따라서, 챕터의 내용은 상당히 생략되어 있으며, 느낀점과 기억해야 할 것들을 주관을 가득 담아 작성했습니다.
노트가 아닌 관계로 포스팅의 영양가는 거의 없으니, 감안하고 봐주셨으면 좋겠습니다.
돌고 돌아 this와 Class를 맛보고 다시 2장인 실행 컨텍스트에 대한 글입니다.
결국에는 참지 못하고 빨리 적게 되었네요.
공부했던 내용을 천천히 짚어나가며, 개념을 구체화하도록 하겠습니다.
실행 컨텍스트는 Javascript에서 일종의 영역에 대한 설명을 모아놓은 것입니다.
정확하게는 특정 영역의 환경값 객체가 되고, 전역 또한 하나의 실행 컨텍스트를 가질 수 있습니다.
이러한 실행 컨텍스트는 함수를 자주 사용하는 저에게 있어 중요한 개념이 됩니다.
함수 또한 실행 컨텍스트를 가지며, 해당 실행 컨텍스트를 엔진에서는 스택(stack) 형식으로 쌓아올려 처리하기 때문입니다.
즉, 코드 내 함수의 실행 순서를 정확하게 파악하는 데에는 실행 컨텍스트라는 개념이 필요하게 됩니다.
그 외에도 실행 컨텍스트 내부에는 다양한 환경값이 존재합니다.
stack은 일종의 구조로, 출입을 한 통로에서 일괄 담당하는 구조입니다.
실제로 이해하기 위해서는 그림을 잔뜩 그려보고, 코드를 쪼개보고 하는 것이 좋습니다.
이 글은 설명이 아니니 포스팅에서는 그렇게 하지 않겠습니다.
google에 stack만 검색해도 구조에 대한 그림이 잔뜩 나오니, 참고하시면 될 것 같습니다.
stack의 경우 출입구가 하나이기에 가장 먼저 들어간 것은 가장 나중에 나오게 됩니다.
이는 자바스크립트 함수의 실행 순서로, 가장 먼저 실행된 함수의 내부에 함수가 실행된다면 가장 먼저 실행된 함수가 내부함수의 종료 이후에 종료되는 방식입니다.
즉, (a-b-c-d -> d-c-b-a)의 형태로 실행 -> 종료 순서가 결정됩니다.
먼저 들어가서 가장 나중에 나와야 하니 어쩌면 a 는 피곤할지도 모르겠습니다.
stack 개념이 없다면, 구글링을 꼭 해보시는 것을 추천드립니다.
그 외 이어지는 다양한 구조도 눈으로 보다 보니 시간 가는 줄 몰랐거든요.
가장 먼저 변수 환경입니다.
변수 환경은 다시 environmentRecord 라는 값과 outerEnvironmentReference 로 나뉘게 됩니다.
변수 환경의 경우 생성 당시의 eR(environmentRecord, ), o(outerEnvironmentReference) 값을 가집니다.
eR에서 var 식별자의 경우 호이스팅이 적용된 상태, 즉 undefined를 할당합니다.
책에서는 이러한 개념을 스냅샷이라고 표현했습니다.
이후 Lexical Environment에서는 다양한 값이 할당되거나 할 수 있지만, Variable Environment의 경우 생성-호출 직후, 즉 아무 값도 존재하지 않는 상태의 변수와 this, 그리고 내부 함수의 선언 정도만을 eR로 갖습니다.
o의 경우 외부 환경에 대한 참조값입니다.
즉, 외부에 존재하는 컨텍스트가 무엇인지 저장하는 곳으로 기억하면 될 것 같습니다.
정확하게는 외부 컨텍스트의 L.E를 저장합니다.
실제 코드 영역에서 사용할 수 있는 개념이 아니니 용어의 정리도 상당히 어려운 것 같습니다.
V.E 의 값을 복사한 후 다양한 값을 할당받아 관리하는 환경입니다.
해당 환경에서는 a 라는 변수가 어떤 값을 가지고 있고, 어떤 순서로 재선언, 재할당되는지 관리하는 eR을 갖습니다.
또한 eR의 초기값은 V.E 에서 파악한 다양한 변수, 함수의 선언 형태를 갖습니다.
이 정도로만 이해할 수 있었지만, 추후에는 더욱 더 많이 생각할 수 있지 않을까 싶습니다.
이러한 개념들을 조합해서 생각해보면 우리가 아는 전역, global의 경우 함수 콜스택 최하층에 존재하는 함수의 outerEnvironmentReferences 로 할당됩니다.
또한 전역 역시 V.E, L.E를 가지고 있습니다.
그렇다는 것은 전역 또한 하나의 컨텍스트로 인정할 수 있게 됩니다.
이 때문에 전역 range의 실행 컨텍스트를 전역 컨텍스트라고 합니다.
또한 책에서는 전역, global의 경우 전역 객체, global object 의 표현을 사용해 이해를 도와주고 있습니다.
거기다 host object 라는 표현을 사용해 자바스크립트 내장 객체와는 분리되었다. 라는 말을 사용하는데, 이건 아직 공부한 적 없는 개념이라 쉽게 넘어가기로 했습니다.
오늘은 간단하게 실행 컨텍스트에 대해 적어봤습니다만, 사실 현재 제 수준에서 이러한 개념을 직접 경험할 일이 없다보니 잘 이해하기 어려운 것 같습니다.
그래도 위와 같은 개념이 존재한다는 사실을 알고 있으니, 앞으로 경험할 일이 생기면 언제든 책을 다시 꺼내볼 수 있을 것 같습니다.
더 발전해서 위 개념을 자유롭게 이용할 수 있는 사람이 되고 싶습니다.
그럼 이번 글은 여기서 마치도록 하겠습니다.
🔥🔥🔥