ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바스크립트 실행컨텍스트 (execution context) 에서 소스코드, 평가와 실행
    문제와 해결/javascript 2023. 4. 19. 01:24

    알고 있던 것

    변수의 선언과 값의 할당이 구분 지어져서 실행되는 것.
    스코프와 전역 객체.
    소스코드는 에디터에 입력하는 코드 전부
    평가? 실행?
    정확히는 모르겠다. 알아보자.

    알게 된 것

    실행 컨텍스트는 소스코드를 실행하는데 필요한 환경을 제공하고,
    코드의 실행 결과를 실제로 관리하는 영역.

    소스코드를 실행하는데 필요한 환경은 스코프(scope)로,
    코드의 실행 결과를 실제로 관리하는 실행 컨텍스트 스택으로 구분할 수 있다.

    식별자(변수, 함수, 클래스 등의 이름)와 스코프는 실행 컨텍스트의 렉시 컬 환경으로 관리하고,
    코드 실행 순서는 실행 컨텍스트 스택으로 관리한다.

    실행컨텍스트를 크게 나누면 이렇게 두 가지로 분류 할 수 있다.

    소스코드

    실행 컨텍스트를 생성하는 4가지 타입의 소스코드가 있다.

    • 전역 코드
    • 함수 코드
    • eval 코드
    • 모듈 코드

    이렇게 4가지로 구분하는 이유는 타입에 따라 실행 컨텍스트를 생성하는 과정과 관리 내용이 다르다고 한다.

     

    1. 전역 코드
    : 전역 코드가 평가되면 전역 실행 컨텍스트 생성
    var로 선언된 전역 변수 그리고 함수 선언문으로 선언된 함수를
    전역 객체에 프로퍼티와 메서드로 바인딩하고 참조하기 위해 전역 객체와 연결한다.

    2. 함수 코드
    : 함수가 평가되면 함수 실행 컨텍스트 생성
    지역 스코프를 생성하고 지역변수, 매개변수, argument 객체를 관리한다.
    생성한 지역 스코프를 전역 스코프에서 시작하는 스코프 체인의 일원으로 연결한다.

    3. eval 코드
    : eval 코드는 strict mode에서 자신만의 독자적인 스코프를 생성. 이걸 위해서 eval 코드가 평가되면 eval 실행 컨텍스트 생성

    4. 모듈 코드
    : 모듈 코드는 모듈별로 독립적인 스코프를 생성 이걸 위해서 모듈 코드가 평가되면 모듈 실행 컨텍스트 생성

    소스코드별로 타입은 다르지만, 평가를 먼저 하고 타입별로 실행 컨텍스트를 생성한다는 건 같다.

     

    평가와 실행

    재밌는 건,

    var x = "a"

    지금까지는 이렇게 입력하면 그냥 "x라는 변수를 선언해서 문자열 a라는 값을 할당했다" 로만 알았다. 하지만,
    평가와 실행 단계로 나눠서 진행되는 걸 알게 됐고, 그런데 단순 평가. 실행. 이분법적으로 나눠지는 게 아니었다.

    1. 소스코드 평가 과정에서 변수 선언문 var x를 실행한다.
    2. 생성자 x는 실행 컨텍스트가 관리하는 스코프에 등록, undefined로 초기화 // 여기까지 평가단계
    3. 평가가 끝나면 소스코드 실행 과정으로 변수 할당문 x="a"가 실행된다.
    4. 이때 x 변수에 값을 할당하려면 x 변수가 스코프에 선언된 변수인지 확인한다. (var는 전역 스코프를 가진다.)
    5. 변수 x가 스코프에 등록되어 있다면 소스코드 평가단계에서 등록된 선언문이 실행돼 등록된 변수이므로, 선언된 변수라면 값 "a"를 할당하고
    6. 할당 결과를 실행 컨텍스트에 등록해서 관리한다.

    이런 과정을 거쳐서 선언된 코드를 평가하고 초기화하고 등록하고 확인하고 실행하고 검색하고 재등록하고... 바쁘다 바빠 실컨사회

     

    정리하면,

     

    평가 과정은
    실행 컨텍스트를 생성하고 변수, 함수의 선언문만 먼저 실행해 생성한 변수나 함수 식별자를
    실행 컨텍스트가 관리하는 스코프(렉시 컬 환경 레코드-lexical environment record)에 등록하고


    실행 과정은 말 그대로 순차적으로 코드가 한 줄씩 실행되는 과정인데,
    변수나 함수를 참조하는 실행 컨텍스트가 관리하는 스코프에서 검색해서 가져온다. 그리고
    소스코드의 실행 결과를 다시 스코프에 반영되는 일련의 과정이 반복된다.

     

    그런데 여기까지는 실행 컨텍스트의 맛보기에 불과한 것 같다.
    개념적으로 무슨 일을 하는지는 알았는데, 구체적으로 뭘 하는지는 실행 컨텍스트의 역할에서 알아봐야겠다.

     

    참고: 모던 자바스크립트 deep dive 23장 실행 컨텍스트

Designed by Tistory.