scope, hoisting, this, function, closure 등의 동작원리를 담고 있는 자바스크립트의 핵심원리이다.
실행 컨텍스트는 실행 가능한 코드를 형상화하고 구분하는 추상적인 개념 이라고 정의한다.
풀어서 설명하면 실행 가능한 코드가 실행되기 위해 필요한 환경 이라고 말할 수 있다고 한다.
(실행 컨텍스트는 실행할 코드에 제공할 환경 정보들을 모아놓는데 함수를 실행할 때마다, 그 함수에 대한 새로운 실행 컨텍스트를 생성하여 자신만의 고유한 컨텍스트(환경) 에서 실행된다고 한다.)
그렇다면 이 실행가능한 코드란 뭐냐면?
이렇게 된다.
일반적으로 실행 가능한 코드는 전역 코드와 함수 내 코드 라고 한다.
자바스크립트 엔진은 코드를 실행하기 위하여 실행에 필요한 여러가지 정보를 알고 있어야 한다. 실행에 필요한 여러가지 정보란 아래와 같은 것들이 있다.
console.log("전역 컨텍스트입니다.");
function func1(){
console.log("func1 입니다.");
}
function func2(){
func1();
console.log("func2 입니다.");
}
func2();
전역 컨텍스트입니다.
fun1 입니다.
fun2 입니다.
위 코드를 실행하면 아래와 같이 실행 컨텍스트 스택(Stack)이 생성하고 소멸한다. 현재 실행 중인 컨텍스트에서 이 컨텍스트와 관련없는 코드(예를 들어 다른 함수)가 실행되면 새로운 컨텍스트가 생성된다. 이 컨텍스트는 스택에 쌓이게 되고 컨트롤(제어권)이 이동한다.

컨트롤이 실행 가능한 코드로 이동하면 논리적 스택 구조를 가지는 새로운 실행 컨텍스트 스택이 생성된다. 스택은 LIFO(Last In First Out, 후입 선출)의 구조를 가지는 나열 구조이다.
전역 코드(Global code)로 컨트롤이 진입하면 전역 실행 컨텍스트가 생성되고 실행 컨텍스트 스택에 쌓인다. 전역 실행 컨텍스트는 애플리케이션이 종료될 때(웹 페이지에서 나가거나 브라우저를 닫을 때)까지 유지된다.
함수를 호출하면 해당 함수의 실행 컨텍스트가 생성되며 직전에 실행된 코드 블록의 실행 컨텍스트 위에 쌓인다.
함수 실행이 끝나면 해당 함수의 실행 컨텍스트를 파기하고 직전의 실행 컨텍스트에 컨트롤을 반환한다
이렇게 자바스크립트는 실행 컨텍스트의 순서를 스택으로 관리한다.
Global Context(전역 컨텍스트)함수 안에서 실행되는 코드가 아니라면 모든 스크립트는 Global Context에서 실행된다.
스택 구조를 가지는 형태로 Execution Context가 생성이 된 후 global object로 window가 this로 할당되고 스택에 쌓이게 된다.
Global Context 안에 포함되는 모든 코드들의 실행 가능한 코드들은 순서대로 스택에 쌓이게 되며
LIFO(Last In First Out)으로 함수를 실행하게 된다.
Functional Context(함수 컨텍스트)Functional Context는 선언된 함수가 호출이 될 때를 기점으로 생성이 되고,
함수의 모든 동작이 종료되면 Functional Context는 소멸된다.
(closure를 사용한다면 스코프가 소멸하지 않고 이용을 할 수가 있다.)
각각의 함수들은 각각의 Functional Context를 가지지만 함수가 호출이 되어야만 생성이된다.
실행 컨텍스트는 물리적으로는 생성할 때 변수 객체, 스코프 체인, this 프로퍼티 등의 속성을 가지게 된다.
변수 객체를 만든다.아래와 같은 코드를 작성했을 때, foo() 함수 실행 컨텍스트 내의 변수 객체는 어떻게 생성될까?
function foo(p1, p2, p3){
var a;
function bar(){
return a*a;
}
return p1 + p2 + p3 + a + bar();
}
foo(3, 4, 5);

이처럼 foo() 실행 컨텍스트의 변수 객체에는 arguments 부터 시작하여 스코프 체인, 함수 인자에 대한 값, 지역 변수, 내부 함수, this 바인딩까지 모든 정보들이 들어가게 됩니다.
- arguments는 foo함수의 인자들이다.
- p1, p2, p3은 3, 4, 5가 할당 된다.
- 변수 a는 undefined로 초기화 된다.
- 스코프 체인은... 다음에 알아봐야겠다.
- this는 전역 객체에 바인딩된다. (JS의 this는 기본적으로 전역 객체에 바인딩된다.)
실행컨텍스트 다들 어떻게 정리하셨나 한번씩 훑어보는 중인데,,
이해가 술술 되는👍 잘 읽고 갑니다!😊