-
TIL-2024.02.23 - JS - 실행 컨텍스트-2. 실행 컨텍스트 스택과 렉시컬 환경> 기초/Javascript 2024. 2. 23. 22:28
------- 실행 컨텍스트 스택 ?
설명:
- 코드의 실행 순서를 스택구조(LIFO)로 관리
- 실행에 따라 실행 컨텍스트가 추가되고 제거된다.
ㅅ 예제:
const x = 1; function foo() { const y =2; function bar(){ const z = 3; console.log(x + y + z) } bar(); } foo(); // 6
- 전역 코드의 평가와 실행:
- 전역 코드를 평가해 전역 실행 컨텍스트를 생성하고 실행 컨텍스트 스택에 푸시
- 전역 변수 X 와 전역 함수 foo가 전역 실행 컨텍스트에 등록
- 이후 전역 코드가 실행되기 시작하여, 전역 변수 X에 값이 할당되고 전역 함수 foo가 호출 - foo 함수 코드의 평가와 실행
- 전역 함수 foo가 호출되면 전역 코드의 실행은 일시 중단되고, 제어권이 foo 함수 내부로 이동
- JS 엔진은 foo 함수 내부의 함수 코드를 평가해 foo 함수 실행 컨텍스트를 생성하고 실행 컨텍스트 스택에 푸시.
- foo 함수의 지역 변수 y 와 중첩함수 bar 가 foo 함수 실행 컨텍스트에 등록
- foo 함수 코드가 실행되기 시작하여 값들이 할당되고 중첩함수 bar 가 호출 - bar 함수 코드의 평가와 실행
- bar 호출되면 foo 함수 코드 실행이 일시 중단되고, 코드 제어권이 bar 함수 내부로 이동
- JS 엔진은 bar 함수 내부 코드를 평가해 bar 함수 실행 컨텍스트를 생성하고 실행 컨텍스트 스택에 이동
- 이때 bar 함수 지역 변수 z가 bar 함수 실행 컨텍스트에 등록
- bar 함수 코드가 실행되기 시작하여 값들이 할당되고 console.log 매서드 호출 후, bar 함수 종료 - foo 함수 코드로 복귀
- bar 함수 종료되면 제어권 다시 foo 함수로 이동
- JS 엔진은 bar 함수 실행 컨텍스트를 실행 컨텍스트 스택에서 팝하여 제거 후, foo 함수 종료 - 전역 코드로 복귀
- foo 함수 종료 시, 제어권은 다시 전역 코드로 이동하며, foo함수 실행 컨텍스트를 실행 컨텍스트 스택에서 제거
- 더 이상 실행될 게 없는 전역 실행 컨텍스트도 실행 컨텍스택에서 팝되어 프로세스 종료
- 이처럼, 실행 컨텍스트 스택은 코드의 실행 순서를 관리
- 실행 컨텍스트 스택의 최상위에 존재하는 실행 컨텍스트는 언제나 [실행 중인 실행 컨텍스트- running execution context]
------- 렉시컬 환경 ?
설명:
- 식별자와 식별자에 바인딩된 값, 그리고 상위 스코프에 대한 참조를 기록하는 자료구조로 실행 컨텍스트를 구성하는 컴포넌트
- 실행 컨텍스트 스택이 코드의 실행 순서를 관리하면, 렉시컬 환경은 스코프와 식별자를 관리
- 렉시컬 환경은 키와 값을 갖는 객체 형태의 스코를 생성 > {식별자: 식별자에 바인딩된 값}
- 스코프를 구분해 식별자를 등록하고 관리하는 저장소 느낌
구성:
- 환경 레코드:
- 스코프에 포함된 식별자를 등록하고 등록된 식별자에 바인딩된 값을 관리하는 저장소
- 환경 레코드는 소스코의 타입에 따라 관리하는 내용에 차이 - 외부 레시컬 환경에 대한 참조:
- 외부 렉시컬 환경에 대한 참조는 상위 스코프를 의미
- 외부 렉시컬 환경, 즉 해당 실행 컨텍스트를 생성한 코드를 포함한 상위 코드의 렉시컬 환경을 의미.
- 외부 렉시컬 환경에 대한 참조를 통해 단방향 링크드 리스트인 스코프 체인을 구현.
'> 기초 > Javascript' 카테고리의 다른 글
TIL-2024.02.26 - JS - 실행 컨텍스트-3. 렉시컬 환경-2 (0) 2024.02.26 TIL-2024.02.25 - JS - MAP과 예제 (1) 2024.02.25 TIL-2024.02.21 - JS - 실행 컨텍스트-1 (0) 2024.02.21 TIL-2024.02.20 - JS - 스코프 (0) 2024.02.20 TIL-2024.02.19 - JS - 변수 - 2. 호이스팅 관점에서 본 var, let, const (0) 2024.02.19