실행 컨텍스트

Khan·2022년 8월 2일
0

TIL

목록 보기
8/19
post-thumbnail

실행 컨텍스트 란

  • 실행 컨텍스트는 실행할 코드에 제공할 환경 정보들을 모아놓은 객체입니다.

  • 동일한 환경에 있는 코드들을 실행할 때 필요한 환경 정보들을 모아 컨텍스트를 구성하고, 이를 콜 스택에 쌓아 올렸다가 가장 위에 쌓여있는 컨텍스트와 관련 있는 코드들을 실행하여 전체 코드의 환경과 순서를 보장합니다.

  • 실행 컨텍스트는 전역 공간에서 자동으로 생성되는 전역 컨텍스트, 함수 실행에 의한 컨텍스트 등이 있습니다.

  • 실행 컨텍스트 객체는 활성화되는 시점에 VariableEnvironment, LexicalEnvironment, thisBinding의 세 가지 정보를 수집합니다.

실행 컨텍스트 역할

  1. 전역 코드 평가
    • 전역 코드에 변수 선언문과 함수 선언문이 먼저 실행 된다 그 결과로 생성 된 전역 변수와 전역 함수들이 전역 스코프에 등록된다.
  2. 전역 코드 실행
    • 전역 변수에 값이 할당되고 전역 함수가 호출된다 만약 함수가 호출 되면 전역 코드 실행은 잠시 멈추고 함수가 먼저 실행된다.
  3. 함수 코드 평가
    • 매개변수와 지역 변수 선언문이 먼저 실행되고, 그 결과로 생성된 매개변수와 지역 변수가 지역 스코프 (실행 된 함수 스코프)에 등록된다.
  4. 함수 코드 실행
    • 순차적으로 코드를 실행한다.

실행 컨텍스트 스택

해당 코드는 전역코드 평가/실행 -> foo 함수 코드 평가 실행 -> bar 함수 코드 평가와 실행(foo함수 일시중단) ->foo 함수 복귀 -> 전역코드로 복귀로 이루어져있다.

해당 코드를 간략히 설명하겠다.

const x = 1;
function foo() {
  const y = 2;

  function bar() {
    const z = 3;
    console.log(x + y + z);
  }

  bar();
}
foo();
  1. foo함수는 전역에서 foo();를 통해 호출되면, 전역코드 실행은 중단되고 코드 제어권이 foo함수 내부로 이동한다.

  2. 그러면 자바스크립트 엔진은 foo함수 내부의 함수코드를 평가하여 foo함수 실행컨텍스트를 생성하고 스택에 푸시한다.

  3. 이때 실행컨텍스트에 foo 함수의 지역변수 y와 중첩함수 bar(함수 내부가 평가되는 것이 아닌, 그저 함수 객체를 등록하는 것)가 등록된다.

  4. 그리고 아래 bar();를 통해 중첩함수 bar가 호출하면서 제어권이 bar함수 내부로 이동하며넛 함수 코드 평가가 이루어지고 foo 함수 실행은 일시중단된다.

  5. bar함수가 종료되어 스택에서 pop되면 foo로 돌아가는데 foo로 돌아가면 더이상 실행할 코드가 없으므로 이 함수도 pop된다. 그러면 이제 다시 전역으로 돌아가는데

  6. 전역에서도 더이상 실행할 코드가 없으므로 pop되며 종료된다.

이처럼 실행 컨텍스트 스택은 코드의 실행순서를 관리한다.

렉시컬 환경은 무엇인가요?

  • Lexical Environment코드 blockfunctionscript를 실행하기 앞서 생성되는 특별한 객체로, 실행할 스코프 범위 안에 있는 변수와 함수를 프로퍼티로 저장하는 객체다.

즉 우리가 소스 코드를 실행하면서 참조가 필요한 변수의 값을 이 Lexical Environment 라는 객체에서 식별자 이름을 키로 찾는다고 보면 된다.

렉시컬 환경의 구성 요소

  1. 환경 레코드(Environment Record)
    • 스코프에 포함된 식별자를 등록하고, 등록된 식별자에 바인딩된 값을 관리하는 저장소입니다.
  2. 외부 렉시컬 환경에 대한 참조(Outer Lexical Environment Reference)
    • 상위 스코프(외부 렉시컬 환경, 즉 해당 실행 컨텍스트를 생성한 소스코드를 포함하는 상위 코드의 렉시컬 환경)를 가리킵니다.
    • 외부 렉시컬 환경에 대한 참조를 통해 단방향 링크드 리스트인 scope chain을 구현합니다.

0개의 댓글