
코드의 실행을 관장하는 객체다.
4가지가 있다.
전역 실행 컨텍스트
런타임 이전이 전역에서 실행되기 전에 생성되는 실행 컨텍스트다.
함수 실행 컨텍스트
런타임 이전이 함수 내부에서 실행되기 전에 생성되는 실행 컨텍스트다.
eval 실행 컨텍스트
런타임 이전이 eval 함수 내부에서 실행되기 전에 생성되는 실행 컨텍스트다.
모듈 실행 컨텍스트
모듈 파일이 로드되고 실행되기 전에 생성되는 실행 컨텍스트다.
전역 실행 컨텍스트와 함수 실행 컨텍스트가 중요하니 이 둘을 알아보자.
이전 포스팅에서 간단하게 설명했는데 이번엔 자세히 알아보자.

실행 컨텍스트는 콜스택에 담긴다.
콜스택은 우리가 알고 있는 FILO의 특징을 가진 스택이다.
콜스택의 최상위 실행 컨텍스트를 현재 실행 중인 실행 컨텍스트 라 한다.
그림에서는 전역 실행 컨텍스트가 해당된다.
그리고 자바스크립트 엔진은 코드 실행을 현재 실행 중인 실행 컨텍스트를 기준으로 진행한다.
즉, 현재 실행 중인 실행 컨텍스트가 바뀌면 이전의 현재 실행 중인 실행 컨텍스트의 런타임을 중단하고, 새롭게 생성된 현재 실행 중인 실행 컨텍스트의 런타임 이전을 진행한다.
이해가 어렵다면 함수 실행 컨텍스트 섹션의 그림을 참고하자.
코드가 전부 실행 되면 실행 컨텍스트는 콜스택에서 pop된다.
그럼 가비지 컬렉터 가 실행 컨텍스트와 연결된 렉시컬 환경, 환경 레코드 등을 순차적으로 제거한다.

전역 실행 컨텍스트 런타임에 foo 함수가 선언되었다.
함수는 Environment 라는 내부 슬롯을 가지는데 이게 함수의 렉시컬 스코프 를 결정한다.
내부 슬롯은 자바스크립트 엔진 만이 사용할 수 있는 코드를 말한다.
일반적으로 외부에 공개되지는 않지만 일부 허용하는 케이스도 있다.
Prototype 내부 슬롯은 __proto__ 라는 getter/setter 접근자 프로퍼티를 제공한다.
렉시컬 스코프는 함수를 어디서 선언했는지에 따라 결정되는 스코프를 말한다.
반대 개념으로 동적 스코프가 있는데 이건 함수를 어디서 호출했는지에 따라 결정되는 스코프를 말한다.
자바스크립트는 렉시컬 스코프를 따른다.
foo 실행 컨텍스트 런타임 이전에 foo 렉시컬 환경이 생성된다.
foo 환경 레코드와 외부 렉시컬 환경 참조도 만들어진다.
foo 환경 레코드에 foo 함수 내부에 선언된 변수들이 저장되고, 외부 렉시컬 환경 참조는 foo 함수 객체의 Environment 를 참조해서 만든다.
이번엔 boo 함수가 선언되는 위치만 바꿔보자.

각 함수들의 렉시컬 환경에 상위 스코프가 만들어졌다.
이런 스코프들이 모여 스코프 체인 을 이룬다.
스코프 체인은 다른 포스팅에서 다루겠다.
또한, 함수 실행 컨텍스트를 기반으로 만들어지는 클로저도 다른 포스팅에서 다루겠다.