1. 실행 컨텍스트의 개념

기존 여러 언어들에는 콜 스택(call stack)이란 것이 존재한다.

콜 스택이란 함수를 호출할 때 해당 함수의 호출 정보가 차곡차곡 쌓여있는 스택을 의미한다.


ECMAScript에서는,

실행 컨텍스트를 "실행 가능한 코드를 형상화하고 구분하는 추상적인 개념"으로 기술한다.

이를 다시 정의하면 "실행 가능한 자바스크립트 코드 블록이 실행되는 환경"이라고 할 수 있다.

이 컨텍스트 안에 실행에 필요한 여러 가지 정보를 담고 있다.


ECMAScript에서는,

실행 컨텍스트가 형성되는 경우를 세 가지로 규정하는데

 - 전역 코드

 - eval() 함수로 실행되는 코드

 - 함수 안의 코드를 실행 할 경우 

 

대부분 프로그래머는 함수로 실행 컨텍스트를 만든다.

그리고 이 코드 블록 안에 변수 및 객체, 실행 가능한 코드가 들어있다.

이 코드가 실행되면 실행 컨텍스트가 생성되고, 실행 컨텍스트는 스택 안에 하나씩 차곡차곡 쌓이고,

제일 위(top)에 위치하는 실행 컨텍스트가 현재 실행되고 있는 컨텍스트이다.


ECMAScript에서는, 

실행 컨텍스트의 생성은 "현재 실행되는 컨텍스트에서 이 컨텍스트와 관련 없는 실행 코드가 실행되면,

새로운 컨텍스트가 생성되어 스택에 들어가고 제어권이 그 컨텍스트로 이동한다" 로 설명한다.

1
2
3
4
5
6
7
8
9
10
11
12
console.log("This is global context");
 
function ExContext1() {
    console.log("This is ExContext1");
};
 
function ExContext2() {
    ExContext1();
    console.log("This is ExContext2");
};
 
ExContext2();
cs


 

위 예제에서 함수 호출로 본 컨텍스트 변화 과정을 그림으로 알아보겠다.




2. 실행 컨텍스트 생성 과정

1) 활성 객체 생성

실행 컨텍스트가 생성되면 자바스크립트 엔진은 해당 컨텍스트에서 실행에 필요한 여러가지 정보를 담은 객체를 생성한다. 

이를 활성 객체라고 한다.

이 객체에 앞으로 매개변수나 사용자가 정의한 변수 및 객체를 저장하고, 새로 만들어진 컨텍스트로 접근 가능하게 되어 있다.

이는 엔진 내부에서 접근할 수 있다는 것이지 사용자가 접근할 수 있다는 것은 아니다.


2) arguments 객체 생성

앞서 만들어진 활성 객체는 arguments 프로퍼티로 이 arguments 객체를 참조한다.


3) 스코프 정보 생성

현재 컨텍스트의 유효 범위를 나타내는 스코프 정보를 생성한다.

이 스코프 정보는 현재 실행 중인 실행 컨텍스트 안에서 연결 리스트와 유사한 형식으로 만들어진다.

현재 컨텍스트에서 특정 변수에 접근해야 할 경우, 이 리스트를 활용한다.

이 리스트로 현재 컨텍스트의 변수뿐 아니라, 상위 실행 컨텍스트의 변수도 접근이 가능하다.

이 리스트에서 찾지 못한 변수는 결국 정의되지 않은 변수에 접근하는 것으로 판단하여 에러를 검출한다.

이 리스트를 스코프 체인이라고 하는데, [[Scope]] 프로퍼티로 참조한다.

현재 생성된 활성 객체가 스코프 체인의 제일 앞에 추가되며 함수의 인자나 지역 변수 등에 접근 가능하다.


4) 변수 생성

현재 실행 컨텍스트 내부에서 사용되는 지역 변수의 생성이 이루어진다.

실제적으로 앞서 생성된 활성 객체가 변수 객체로 사용된다.

활성 객체나 변수 객체는 같은말이다.

이 과정에서 함수 안에 정의된 지역 변수나 내부 함수가 생성된다.

주의할 점은 변수나 내부 함수들은 단지 메모리에 생성되는 것이지 초기화는 각 변수나 함수에 해당하는 표현식이 실행되기 전까지 이루어지지 않는 다는 점이다.

함수 호이스팅이 궁금증이 풀리는 부분이다.


5) this 바인딩

마지막 단계에서는 this 키워드를 사용하는 값이 할당된다.

this가 참조하는 객체가 없으면 전역 객체를 참조한다.


6) 코드 실행

위 과정으로 하나의 실행 컨텍스트가 생성되고, 변수 객체가 만들어 진 후에, 코드에 있는 여러 가지 표현식 실행이 이루어진다.

이렇게 실행되면서 변수의 초기화 및 연산, 또 다른 함수 실행 등이 이루어진다.

여기서 전역 실행 컨텍스트는 arguments 객체가 없으며, 전역 객체 하나만을 포함하는 스코프 체인이 있다.

ECMAScript에서 언급된 바에 의하면 실행 컨텍스트가 형성되는 세 가지 중 하나로서 전역 코드가 있는데,

이 전역 코드가 실행될 때 생성되는 컨텍스트가 전역 실행 컨텍스트다.

전역 실행 컨텍스트에서는 변수 객체가 곧 전역 객체이다.

따라서 전역적으로 선언된 함수와 변수가 전역 객체의 프로퍼티가 된다.

전역 실행 컨텍스트 역시, this를 전역 객체의 참조로 사용한다.


Posted by 프로그래머세바 박현진

+ Recent posts