실행 컨텍스트는 Javascript 언어로 작성된 코드를 실행하기 위해 필요한 환경이다.
함수가 호출되면, 새로운 실행 컨텍스트는 생성되어 CallStack 에 쌓이고, 함수 실행이 끝나면 제거된다.
// foo();
function foo() {
let a= 1
console.log('foo');
}
function temp() {
this.b = 1;
}
// 기본바인딩
temp();
console.log()
// 암시적바인딩
const a = {
temp : temp,
}
a.temp();
// 명시적 바인딩
temp.call(a);
// new
const c = new temp()
생성단계 - EC foo[]
실행단계 - EC 를 이용해서 foo 참조가 가능하다.
위와 예제를 통해 살펴보면, 우선 전역에서 실행되는 환경을 제공하기 위한 Global Context가 CallStack 을 구성한다. 그리고 foo() 함수를 호출하면 foo 함수에 대한 Execution Context 가 쌓이게 되고, 이후 bar() 함수를 위한 실행 컨텍스트도 콜스택에 순차적으로 쌓이게 된다.

실행 컨텍스트가 함수 호출이 발생할 때마다 생성되는 것은 이해가 됐다.
그럼 실행 컨텍스트는 무엇을 위해 필요하고, 왜 함수 호출마다 생성되는 것일까?
이제 하나씩 천천히 살펴보자.
실행 컨텍스트는 세 가지 영역으로 구분된다.
VariableEvironment는 LexicalEnvironment 과 유사한 기능이므로 LexicalEnvironment만 언급한다.
실행 컨텍스트는 함수 호출마다 생성되므로, LexicalEnvironment는 해당 함수에서 선언된 변수, 내부함수, 파라미터를 저장한다.
function foo(b) {
var a = 1;
function bar() {
var c = 3;
}
bar();
}
foo(2);