* 실행 컨텍스트(Execution Context)
- 코드의 실행 순서와 스코프를 기억
- 자바스크립트 런타임안에 Call Stack이 있는데 Call Stack를 통해서 하나하나씩 코드의 실행순서를 기억한다.
- 자바스크립트는 단 하나의 싱글 컨텍스트 스택이 있다.
- 한번에 하나의 일만 처리 할 수 있다.
* 어떻게 블럭안에 데이터가 있는지 없는지 확인하고 그리고 근접한 부모의 스코프를 찾는걸까???
- 이유는 각각의 블록은 렉시컬 환경(Lexical Environtment)라는 내부 오브젝트를 가지고 있다.
- 그래서 각각 블럭 마다 어떤 변수들이 들어있는지 부모는 누구인지에 대한 정보를 가지고있는 오브젝트가 있다.
- 실행순서와 각각의 블럭에 대한 정보들을 한 오브젝트안에 데이터를 담아둔다.
* 렉시컬 환경 내부
- 환경 레코드(Environment Record) : 현재 블럭의 해당하는 정보를 담고있는 환경 레코드
- 외부 환경 참조(Outer Lexical Environment Reference) : 부모는 누구인지 부모를 참조하고 있는 외부 환경 참조
* 실행 컨텍스트 스택
- 코드가 실행이 되면 전역스코프 렉시컬 환경이 만들어진다. // 외부 렉시컬 환경 참조 : null
- 이후 블럭1 렉시컬 환경이 만들어진다. // 외부 렉시컬 환경 참조 : 전역 렉시컬 환경(부모)
- 이렇게 스코프들이 연결되어 있는것을 스코프 체인이라고 한다.
- 블럭이 모두 끝나게 되면 하나하나씩 스택에서 빠지고 전역이 다 끝나야 스택이 텅텅비어진다.
- 메모리 절약 뿐만 아니라, 성능을 위해서라도 변수는 최대한 필요한 곳에서 정의해야 한다.
- 중첩된 스코프나 중첩된 함수가 있다면 스코프 체인을 따라서 계속 확인을 하기 때문에 성능이 저하된다.
* 스코프란?
- 식별자가 유효한 범위
- 스코프 외부에서는 스코프 내부에 있는거에 대해서 접근할 수 없지만 스코프 내부에서는 외부에 있는 그 어떤 부모의 데이터도 접근할 수 있다.
- 이렇게 접근할 수 있는 이유는 각각의 스코프는 렉시컬 환경이란것이 있는데 그안에 외부 렉시컬 환경 참조를 통해서 스코프 체인을 통해서 찾아가면서 부모의 데이터에 접근할 수 있기 때문이다.
* 실행 컨텍스트(Execution Context)예시코드
- 코드의 실행 순서와 스코프를 기억!
- 각각의 블럭은 렉시컬 환경(Lexical Environtment)을 가지고 있다.
- 렉시컬 환경(Lexical Environtment)내부에는 1. 환경 레코드(Environment Record) 2. 외부 환경 참조(Outer Lexical Environment Reference)이 있다.
// 전역스코프
const a = 1;
{
// 블럭1스코프
const a = 2;
{
// 블럭2스코프
const a =3;
}
}
'Study > JavaScript' 카테고리의 다른 글
[JavaScript_study] var을 쓰지 말자 (0) | 2022.04.14 |
---|---|
[JavaScript_study] 호이스팅 (Hoisting) (0) | 2022.04.14 |
[JavaScript_study] 가비지 컬렉션 (garbage collection) (0) | 2022.04.14 |
[JavaScript_study] 스코프(Scope) (0) | 2022.04.14 |
[JavaScript_study] fetch api (0) | 2022.04.13 |