실행 컨텍스트

WONNY_LOG·2023년 11월 27일

실행 컨텍스트란

실행할 코드에 제공할 환경 정보들을 모아놓은 객체

  • 자바스크립트의 동적 언어로서의 성격을 가장 잘 파악할 수 있는 개념이다.
  • 자바스크립트는 동일한 환경에 있는 환경 정보들을 모은 실행 컨텍스트를 콜스택에 쌓아올린 후 실행하여 코드의 환경과 순서를 보장할 수 있게 된다.
    (여기서 환경은 : 전역공간이 될 수 있고, 함수 즉 함수 내부의 환경이 될 수 있다.)

실행 컨텍스트의 생성 시점

  • 자바스크립트 엔진이 스크립트를 처음 마주할 때 전역 컨텍스트를 생성하고, 콜 스택에 push 한다.
  • 엔진이 스크립트를 쭉 읽어내려가면서 함수 호출을 발견할 때마다, 함수의 실행 컨텍스트를 스택에 push 한다.

중요한 점은 함수 실행 컨텍스트는 함수가 실행될 때! 만들어진다는 점!

함수를 선언할 때가 아니라 실행할 때이다.


실행 컨텍스트의 종류

1. 전역 실행 컨텍스트 (Global Execution Context (GEC))

브라우저에 파일이 처음 로드될 때 자바스크립트 코드가 실행을 시작하는 기본 실행 컨텍스트이다.

  • Global Variable, Global Scope 등과 같은 Global 개념이며 전역으로 자바스크립트가 실행 될 때의 실행 환경을 GEC 라고 부른다.
  • 함수나 객체에 없는 모든 전역 코드,
    즉 코드가 글로벌 실행 컨텍스트 내에서 실행된다.
  • 또한 자바스크립트 엔진이 싱글 스레드이기 때문에 자바스크립트 코드를 실행할 수 있는 글로벌 환경은 1개만 존재한다.

2. 함수 실행 컨텍스트 (Functional Execution Context (FEC))

함수 실행 컨텍스트는 함수 호출을 찾을 때마다 자바스크립트 엔진에 의해 생성된 컨텍스트로 정의된다.

  • 자바스크립트가 함수마다 스코프를 가지는 것처럼 각 함수는 고유한 실행 컨텍스트를 가진다.
  • 글로벌 실행 컨텍스트와는 달리 1개 이상일 수 있다.
  • 전역 실행 컨텍스트 코드를 실행하는 동안 자바스크립트 엔진이 함수 호출을 찾으면 해당 함수에 대한 새로운 함수 실행 컨텍스트를 생성한다.

3. Eval (안쓴다고 보면됨)

  • Eval 함수는 문자로 표현된 JavaScript 코드를 실행하는 함수로 Eval 함수를 호출 및 실행 하게 될 때 그 내부적으로 실행 컨텍스트가 생성 된다.
  • 하지만 문자열로부터 Eval 함수를 실행하는 것은 엄청나게 위험하다고 한다.
  • Eval 함수를 사용하면 해커가 위험한 코드를 사용할 수 있다고 한다. 그러한 이유로 잘 다루지 않는다.

실행 컨텍스트 실행 순서

var temp = 'temp';

function foo (){
  console.log('hi');
}

function f002 (){
  foo();
}

foo2();

(1) 콜스택엔 전역 컨텍스트를 제외하곤 다른 컨텍스트가 없기에 전역 컨텍스트와 관련된 코드를 진행합니다.
(2) 전역 컨텍스트와 관련된 코드를 진행 중 a함수를 실행하였기에 a 함수의 환경 정보들을 수집하여 a 실행 컨텍스트를 생성, 콜스택에 담습니다.
콜스택 최상단에 a 실행 컨텍스트가 있기에 기존의 전역 컨텍스트와 관련된 코드의 실행을 일시적으로 중단한 후 a 실행 컨텍스트의 코드를 실행합니다.
(3) a 함수 내부에서 b 함수를 실행하였기에 b 함수의 환경 정보들을 수집, 실행 컨텍스트를 생성, 콜스택에 담습니다. 
이전과 똑같이 콜스택 최상단에 b 실행 컨텍스트가 있기에 기존 a 실행 컨텍스트와 관련된 코드의 실행을 일시적 중단합니다.
(4) b 함수가 종료된 후 b 실행 컨텍스트가 콜스택에서 제거됩니다. 
제거 후 콜스택 최상단에는 a 실행 컨텍스트가 있기에 이전에 중단된 지점부터 코드 진행이 재개됩니다.
(5) a 함수 또한 종료된 후 실행 컨텍스트가 콜스택에서 제거됩니다.
이후엔 전역 공간에 실행할 코드가 남아있지 않다면 콜스택에서 전역 컨텍스트 또한 제거되며 콜스택에 아무 것도 남지 않은 상태로 종료됩니다.













참고자료1

0개의 댓글