실행 컨텍스트
- 자바스크립트 코드가 어떻게 실행되는지 이해하기 위해 알아야하는 개념
- 실행 컨텍스트는 실행되는 코드의 한 덩어리라고 생각하면 된다.
실행 가능한 코드란?
- 전역 코드 : 전역 영역에 존재하는 코드
- Eval 코드 : eval 함수로 실행되는 코드
- 함수 코드 : 함수 내에 존재하는 코드
자바스크립트 엔진은 코드들을 실행하기 위하여 실행에 필요한 여러가지 정보들을 알고 있어야한다. 실행에 필요한 여러가지 정보들은 다음과 같다.
- 변수 : 전역변수, 지역변수, 매개변수, 객체의 프로퍼티(속성)
- 함수 선언
- 변수의 스코프(유효범위)
- this
2개의 함수가 있다고 가정하면, 자료구조의 스택과 같이 쌓이고 빠진다.
전역 실행 컨텍스트가 실행 컨텍스트 스택에 쌓인다.
함수 실행 컨텍스트가 실행 컨텍스트 스택에 쌓인다.
두번재 함수 실행 컨텍스트가 실행 컨텍스트 스택에 쌓인다.
두번재 함수 실행 컨텍스트가 실행되서 스택에서 빠진다.
첫번째 함수 실행 컨텍스트가 실행되서 스택에서 빠진다.
전역 실행 컨텍스트가 실행되서 스택에서 빠진다.
렉시컬 환경
- 키와 값을 갖는 객체 형태의 스코프 (전역, 함수, 블록 스코프)를 생성하여 식별자를 키로 등록하고, 식별자에 바인딩된 값을 관리한다.
- 스코프를 구분하여 식별자를 등록하고 관리하는 저장소 역할
Environment Record 환경 레코드
- 스코프에 포함된 식별자를 등록하고, 등록된 식별자에 바인딩된 값을 관리하는 저장소다.
Outer Lexical Environment Reference 외부 렉시컬 환경에 대한 참조
- 외부 렉시컬 환경에 대한 참조는 상위 스코프(외부 렉시컬 환경)를 가리킨다. 단방향 Linked List인 스코프 체인을 구현한다.
Variable Object 변수 객체
실행 컨텍스트가 생성되면 자바스크립트 엔진은 실행에 필요한 정보들을 담는 객체를 생성한다. 이것을 Variable Object(VO)라고 한다.
이는 코드가 실행 될 때 엔진에 의해 참조되며 코드에서 접근할 수 없다.
VO는 변수, 매개변수와 인수, 그리고 함수 선언 정보를 담는 객체이다.
this
this는 현재 실행 컨텍스트의 위치에 따라서 다르게 출력된다.
어떤 순서대로 진행될까?
- 전역 실행 컨텍스트 생성 (global execution context)
- 전역 렉시컬 환경 생성 (global lexical environment)
2-1. 전역 환경 레코드 생성 (lexical environment - environment record)
2-1-1. 객체 환경 레코드 생성 (lexical environment - object environment record)
2-1-2. 선언적 환경 레코드 생성 (declarative environment record)
2-2. this 바인딩
2-3. 외부 렉시컬 환경에 대한 참조 결정 (lexical environment - outer lexical environment reference)
함수는 어떤 순서대로 진행될까?
- 함수 실행 컨텍스트 생성
- 함수 렉시컬 환경 생성
2-1. 환수 환경 레코드 생성
2-2. this 바인딩
2-3. 외부 렉시컬 환경에 대한 참조 결정 (전역 렉시컬 환경을 가리키게된다)
정리
- 실행 컨텍스트는 실행되는 코드의 한 덩어리를 의미하며, 자바스크립트 코드가 실행되고 스코프 체인, 변수 객체, this 정보들을 담고 있는 곳을 의미한다.
- 전역 컨텍스트 하나 생성 후에 함수를 호출할 때마다 함수 컨텍스트가 생성된다.
- 함수 실행이 끝나면 해당 컨텍스트는 사라지고,
- 페이지가 종료되면 전역 컨텍스트가 사라진다.
참고
자바스크립트 Deep dive