[JavaScript] execution context - 실행 컨텍스트

참고 : https://poiemaweb.com/js-execution-context

되도록 그림을 보고 이해하는게 더 빠를 것 같다.

실행 컨텍스트

실행 컨텍스트는 자바스크립트의 동작원리를 담고 있는 핵심 원리이다. 또는 실행 가능한 코드를 형상화하고 구분하는 추상적인 개념이라고 ECMAScript 스펙에 정의되어있다. 이는 실행 가능한 코드가 실행되기 위해 필요한 환경이라고 할 수도 있다.

실행가능한 코드란, 전역 코드, Eval 코드, 함수 코드가 있다. 어떤 코드를 실행할 때, 실행 컨텍스트 스택이 생성하고 소멸한다. 현재 실행 중인 컨텍스트에서 해당 컨텍스트와 관련없는 코드가 실행되면 새로운 컨텍스트가 생성된다. 그리고 이 컨텍스트는 스택에 쌓이게 되고 제어권이 이동한다.

  1. 컨트롤이 실행 가능한 코드로 이동하면 논리적 스택 구조를 가지는 새로운 실행 컨텍스트 스택이 생성된다. 이 스택은 LIFO(후입 선출)의 구조를 가지는 나열 구조이다.

  2. 전역 코드로 컨트롤이 진입하면, 전역 실행 컨텍스트가 생성되고 실행 컨텍스트 스택에 쌓인다. 전역 실행 컨텍스트는 애플리케이션이 종료될 때까지 유지된다.

  3. 함수를 호출하면 해당 함수의 실행 컨텍스트가 생성되며, 직전에 실행된 코드 블록의 실행 컨텍스트 위에 쌓인다.

  4. 함수 실행이 끝나면 해당 함수의 실행 컨텍스트를 파기하고, 직전의 실행 컨텍스트에 컨트롤을 반환한다.

실행 컨텍스트의 3가지 객체

실행 컨텍스트는 실행 가능한 코드를 형상화하고 구분하는 추상적인 개념이지만 물리적으로는 객체의 형태를 가지며 아래의 3가지 프로퍼티를 소유한다.

  1. Variable Object
  2. Scope Chain
  3. thisValue

Variable Object (VO / 변수객체)

실행 컨텍스트가 생성되면 자바스크립트 엔진은 실행에 필요한 여러 정보들을 담을 객체를 생성한다. 이를 Variable Object라고 한다. VO는 코드가 실행될 때 엔진에 의해 참조되며 코드에서는 접근할 수 없다.

Variable Object는 변수, 매겨변수와 인수정보, 함수 선언을 담는 객체이다. 그리고 VO는 실행 컨텍스트의 프로퍼티이기 때문에 값을 갖는데, 이 값은 다른 객체를 가리킨다. 이는 모든 전역 변수, 전역 함수 등을 포함하는 전역 객체(Global Object)를 가리킨다. 그리고 전역 객체는 전역에 선언된 전역 변수와 전역 함수를 프로퍼티로 소유한다. 그리고 함수 컨텍스트의 경우, Activation Object라고 하는데 이는 매개변수와 인수들의 정보를 배열의 형태로 담고 있는 객체인 arguments가 추가된다.

나도 무슨 말인지 모르겠다..

Scope Chain

스코프 체인은 일종의 리스트이다. 전역 객체와 중첩된 함수의 스코프와 레퍼런스를 차례로 저장한다. 즉, 해당 전역 또는 함수가 참조할 수 있는 변수, 함수 선언 등의 정보를 담고 있는 전역 객체또는 활성 객체릐 리스트를 가리킨다.

현재 실행 컨텍스트의 활성 객체를 선두로, 마지막 리스트는 전역 객체를 가리킨다. 즉, 변수를 검색하는 메커니즘이라 할 수 있다. 식별자 중 변수가 아닌 객체의 프로퍼티를 검색하는 메커니즘은 프로토타입 체인이라 한다.

this value 결정