23 실행컨텍스트

개발쟁이·2021년 4월 21일
0

자바스크립트 엔진 : 소스 코드를 평가 → 실행 하는 과정으로 처리

소스 코드 평가시 , 실행 컨텍스트 생성, 변수 함수 e등 이 선언문 먼저 실행해 스코프에 등록.

런타임 : 소스평가 과정 이후 순차적으로 실행, 필요시 실행컨텍스트 스코프에서 변수 검색 . 실행 결과는 다시 실행컨텍스트 스코프에 등록됨

ECMAScript 4가지 타입

4가지 코드가 평가된후 실행 컨텍스트 생성됨

  • 전역 코드 : 전역에 존재하는 소스코드 (함수, 클래스 제외), 전역 객체의 프로퍼티와 메서드로 바인딩 하고 참조위해 전역객체와 연결. 전역 코드 평가 → 실행컨텍스트 생성
    cf)전역 객체는 전역코드 평가 이전 생성되고 전역객체도 Object.prototype 상속 받음

  • 함수코드: 함수 내부 존재하는 소스코드 (함수 내부 중첩함수, 클래스 제외) 지역 스코프 생성, 지역변수 매개변수, arguments객체 관리 . 지역 스코프를 전역 스코프의 체인의 일원으로 연결

  • eval 코드 : 전역함수 eval에 인수로 전달되어 실행되는 코드 → strict mode에서 독자적 스코프 생성.

  • 모듈코드 : 모듈 내부 존재하는 소스코드

실행컨텍스트 (Execution Context)

식별자 등록, 관리하는 스코프와 코드 실행 순서 관리 구현한 내부 매커니즘으로 모든 코드는 실행 컨텍스트 통해 실행, 관리됨

  • 식별자, 스코프는 실행 컨텍스트의 렉시컬 환경으로 관리.
  • 코드실행 순서는 실행 컨텍스트 스택으로 관리됨. push, pop 됨
  • 실행컨텍스트 스택의 최상위에 존재하는 실행 컨텍스트를 실행중인 실행 컨텍스라 부름

렉시컬환경

식별자, 바인딩값 , 상위 스코프에 참조를 기록하는 자료 구조로 실행 컨텍스트를 구성하는 컴포넌트. 즉, 스코프와 식별자 관리

렉시컬환경은 키:값 형태의 스코프(전역, 함수, 블록 스코프) 생성해 식별자를 키로등록하고 식별자에 바인딩된 값 관리.

Execution Context

실행 컨테스트는 LexicalEnviroment, VariableEnviroment 컴포넌트로 구성되어있다. 생성초기 위 둘은 하나의 동일한 Lexical Enviroment를 참조, 상황에 따라 둘의 컴포넌트 내용 달라지기도함

Lexical Enviroment

컴포넌트로는 (EnviromentRecod, OuterLexicalEnviromentReference) 두가지 있다

  • EnviromentRecod :식별자 등록, 바인딩된값 관리 저장소. 내부 슬롯에 this가 바인딩됨. [[ GlobalThisValue ]]

  • OuterLexicalEnviromentReference :상위 스코프(해당 실행 컨텍스트 생성한 소스코드 포함하는 상위코드 렉시컬 환경)가리킴 , 단방향 Likned listed In Scope chain 구현 스코프 체인의 종점. 전역렉시컬 환경에서 검색불가능한건 식별자 참조 에러 발생

전역 코드 평가 순서

  1. 전역 실행 컨텍스트 생성
  2. 전역 렉시컬 환경 생성
    2.1 전역 환경 레코드 생성 (이떄, this 바인딩 업음)
    - 2.1.1 객체 환경 레코드 생성
    - 2.1.2 선언적 환경 레코드 생성
    2.2 this바인딩
    2.3 외부렉시컬 환경에 대한 참조 결정
  • 객체환경 레코드 : var로 선언한 변수, 선언문, 빌트인 전역함수/전역 프로퍼티

  • 선언적 환경레코드 : let const로 선언한 전역 변수. 특히 const로 선언한 변수는 선언과 초기화 단계가 분리되어진행. 런타임이 변수 선언문에 도달하기 까지 일시적 사각지대(Temporal Dead Zone) 에 빠짐. let const도 호이스팅 발생하나, TDZ 때문에 참조가 불가능한것

전역 함수는 BinaryObject를 통해 객체의 프로퍼티, 메서드가 됨
예 window.alert

코드 평가 시점에 BindngObject를 통해 전역객체에 변수를 식별자 키로 등록 → undefined 바인딩 해 변수 호이스팅 발생 단, 변수 선언문 이전에 참조한 변수의 값은 undfined.

함수 선언문에서 정의된 함수 평가 → 동일한 이름의 식별자 를 BindngObject로 전역 객체 에 키로 등록, 함수 객체 즉시 할당. 즉 함수 선언문으로 정의한 함수는 함수 선언문 이전에 호출 가능
=> 이게 변수 호이스팅, 함수 호이스팅 차이점

실행 컨텍스트 스택에서 실행하던 실행컨텍스트 제거되었다고 렉시컬 환경까지 즉시 소멸하지 않음. 객체를 포함한 모든 값은 참조되지 않을때 GC에의해 해제되어 소멸

profile
개발 인생

0개의 댓글

관련 채용 정보