JS엔진이 코드를 실행하기 위해서는 스코프, 식별자, 코드 실행순서
등의 관리가 필요하다.
이러한 모든것을 관리하는 것이 실행컨텍스트로 소스의 실행 환경을 제공
하고, 실행결과를 관리
하는 영역이다.
- 실행 컨텍스트는 객체로 존재
- 엔진이 사용하기위한 객체로, 개발자가 코드를 통해 접근할수 없다.
- 실행 컨텍스트는 렉시컬 환경을 구성요소로 가지고 있다.
소스 코드타입에 따라 실행 컨텍스트도 각각 생성되며 조금씩 다르게 생성/관리된다.
LexicalEnvironment와 VariableEnviroment를 구성요소로 갖는다.
- LexicalEnvironment
- VariableEnviroment
식별자와 그에 바인딩된 값, 상위 스코프에 대한 참조를 가지고 있는 자료구조로 실행컨텍스트의 구성요소
이다.
아래의 구성요소를 갖는다.
- EnvironmentRecord
- 스코프에 포함된 식별자를 등록하고, 식별자에 바인딩된 값을 관리
- 소스코드의 타입에 따라 관리하는 내용에 차이가 있다.
- OuterLexicalEnvironmentReference
- 상위 스코프를 가리킨다.
- 상위 스코프의 렉시컬 환경을 말함.
var x=1; //Line 1 const y=2; //Line 2 function foo(a){ //Line 3 var x=3; //Line 4 const y=4; //Line 5 function bar(b){ //Line 6 const z=5; //Line 7 console.log(a+b+x+y+z); //Line 8 } //Line 9 bar(10); //Line 10 } //Line 11 foo(20) //42 //Line 12
- 전역객체 생성(window)
- 전역코드 평가 (1단계)
- 전역코드 실행
1.foo 함수 코드 평가(2단계)
- foo(20) 실행
2.1 bar 함수 코드 평가(3단계)
2.2 bar(10) 함수 실행
2.3 bar(10) 함수 실행 종료- foo(20) 실행 종료
- 전역 코드 실행 종료
- 전역 실행 컨텍스트 생성
- 전역 렉시컬 환경 생성
2.1 GlobalEnvironmentRecord(전역환경 레코드) 생성
- 2.1.1 ObjectEnvironmentRecord(객체 환경 레코드) 생성
- 2.1.2 DeclarativeEnvironmentRecord(선언적 환경 레코드) 생성
2.2 this바인딩
2.3 OuterLexcialEnviromentReference(외부렉시컬 환경)에 대한 참조 결정
![]() |
---|
Line 2 실행 후 렉시컬 환경 |
- 함수 실행 컨텍스트 생성
- 함수 렉시컬 환경 생성
2.1 FunctionEnvironmentRecord(함수 환경 레코드) 생성
2.2 this바인딩
2.3 OuterLexcialEnviromentReference(외부렉시컬 환경)에 대한 참조 결정
![]() |
---|
Line 4 실행 전 렉시컬 환경 |
렉시컬 스코프(lexical scope)
이고,다이나믹 스코프(dynamic scope)
이다.자바스크립트는 렉시컬 스코프
이다.스코프 체이닝
이 이루어진다.arguments
레코드가 생성된다.
- 렉시컬 환경 생성 순서는 foo함수 코드평가 단계(2단계)와 동일한다.
- 함수 실행 컨텍스트 생성
- 함수 렉시컬 환경 생성
2.1 FunctionEnvironmentRecord(함수 환경 레코드) 생성
2.2 this바인딩
2.3 OuterLexcialEnviromentReference(외부렉시컬 환경)에 대한 참조 결정
![]() |
---|
Line 6 실행 전 렉시컬 환경 |