본문 바로가기
Javascript

[Javascript] 실행 컨텍스트 Execution context

by oyeahhh 2021. 1. 3.

정의

  • 자바스크립트가 실행될 때 생성되는 하나의 실행 단위
  • 실행 가능한 자바스크립트 코드 블록이 실행되는 환경
    • 실행 가능한 코드 블록은 대부분의 경우 함수가 된다.

 

목적

개발을 할 때 코드의 복잡성을 관리하기 위해 functions, modules, packages등으로 나눠서 사용하는 것처럼 실행 컨텐스트도 자바스크립트 엔진이 코드의 해석과 실행의 복잡성을 관리할 수 있게 해주는 것이다.

 

생성

아래 3가지의 경우 실행 컨텍스트가 생성된다.

  1. 전역 코드
  2. eval() 함수로 실행되는 코드
  3. 함수 안의 코드를 실행하는 경우

생성된 실행 컨텍스트는 실행 컨텍스트 스택에 쌓이게 되고 제일 위에 위치하는 실행 컨텍스트가 현재 실행되고 있는 컨텍스트다. 현재 실행되는 컨텍스트에서 이 컨텍스트와 관련 없는 실행 코드가 실행되면, 새로운 컨텍스트가 생성되어 스택에 들어가고 제어권이 그 컨텍스트로 이동한다. 새로운 함수 호출이 발생하면 새로운 컨텍스트가 만들어지고 실행되며, 종료되면 반환된다.

 

활성 객체 Activation Object (변수 객체)

  • 실행 컨텍스트에서 실행에 필요한 여러 가지 정보를 담은 객체
  • 매개변수, 사용자가 정의한 변수 및 객체를 저장한다.
  • 새로 만들어진 컨텍스트에 접근할 수 있다.
    • 엔진 내부에서 접근할 수 있다는 것이지 사용자가 접근할 수 있다는 것은 아니다.
  • 변수 객체와 동일한 객체, 표현만 다를 뿐.

 

생성 과정

  1. 실행 컨텍스트 생성
  2. 활성 객체 생성 (변수 객체라고도 한다)
  3. 활성 객체 내부에서 arguments 객체 생성
  4. 현재 컨텍스트의 유효 범위를 나타내는 스코프 정보 생성 (스코프 체인 생성)
    • 현재 실행 중인 실행 컨텍스트 안에서 연결 리스트와 유사한 형식으로 만들어 진다.
    • 현재 컨텍스트에서 특정 변수에 접근해야 할 경우, 이 리스트를 활용한다.
    • 현재 컨텍스트의 변수뿐만 아니라 상위 실행 컨텍스트의 변수도 접근이 가능하다.
    • 이 리스트를 스코프 체인이라고 한다
    • [[scope]] 프로퍼티로 참조된다.
    • 활성 객체가 스코프 체인 제일 앞에 추가된다.
  5. 지역 변수 생성 (활성 객체에 저장)
    • 이 과정에서는 변수나 내부 함수를 단지 메모리에 생성만 한다.
    • 초기화는 각 변수나 함수의 표현식이 실행되기 전까지는 이루어지지 않는다.
    • 표현식의 실행은 변수 객체 생성이 끝난 후에 시작된다.
    • 생성 단계에서 변수의 선언시 undefined로 값이 초기화되는 데 이것을 호이스팅(Hoising)이라고 한다.
  6. this 키워드를 사용하는 값이 할당된다 (this 바인딩)
    • 참조하는 객체가 없으면 전역 객체를 참조한다.
  7. 여러 가지 표현식 실행
    • 변수의 초기화 및 연산, 또 다른 함수 실행 등

 

전역 실행 컨텍스트

  • 가장 먼저 실행되는 컨텍스트, 그 뿐이다.
  • 전역 코드가 실행될 때 생성되는 컨텍스트가 전역 실행 컨텍스트.
  • 전역 실행 컨텍스트는 일반 실행 컨텍스트와 다르게 arguments 객체가 없으며, 전역 객체 하나만을 포함하는 스코프 체인이 있다.
  • 전역 실행 컨텍스트의 변수 객체가 전역 객체로 사용된다.
  • 전역 실행 컨텍스트의 변수 객체가 곧 전역 객체이다.
  • 전역적으로 선언된 함수와 변수가 전역 객체의 프로퍼티가 된다.
  • this를 전역 객체의 참조로 사용한다.
  • 브라우저에서는 최상위 코드가 곧 전역 코드지만, Node.js에서는 다르다.

 

출처

댓글