Execution Context & Lexical Environment
실행 컨텍스트와 렉시컬 환경
Jan 15, 2024
실행 컨텍스트(Execution Context)
- 콜스택(call stack)에 들어가는 실행 정보
- 코드의 실행 순서와 스코프를 기억
- 실행 가능한 자바스크립트 코드 블록이 실행되는 환경
실행 컨텍스트 형성 조건
- 전역 코드
- 함수 안의 코드 실행
- eval() 함수 실행
실행 컨텍스트 동작 방식
- 현재 실행되는 컨텍스트가 있음
- 현재 실행되는 컨텍스트와 관련 없는 실행 코드가 실행됨
- 새로운 컨텍스트가 생성되어 스택에 들어감
- 제어권이 그 컨텍스트로 이동
console.log("global-context"); function exContext() { console.log("exContext func"); } exContext(); // 실행 순서 // global-context // exContext func
스코프(Scope)
- 식별자(변수, 함수, 클래스 이름)가 유효한 범위
- 선언된 위치에 따라 유효범위가 결정됨
- 블록
{...}
안에서 유효
스코프 접근 범위
스코프 밖에서 안으로 접근 불가하지만 안에서는 밖으로는 접근 가능
→ 스코프 안에는 렉시컬 환경이 있는데 외부 환경 참조를 스코프 체인을 통해 참조하기 때문에 가능
렉시컬 환경(Lexical Environment)
렉시컬 환경을 갖는 요소
- 실행중인 함수
- 코드 블록
{...}
- 스크립트 전체
렉시컬 환경 구성 요소
- 환경 레코드(Environment Record): 모든 지역 변수를 프로퍼티로 저장하고 있는 객체.
this
값과 같은 기타 정보도 저장되어 있음. - 외부 렉시컬 환경(Outer Lexical Environment)에 대한 참조 - 외부 코드와 연관됨.
렉시컬 환경(함수)과 동작방식
- 모든 함수는 함수가 호출된 곳의 렉시컬 환경이 아닌 생성된 곳의 렉시컬 환경을 기억함.
함수는 숨김 프로퍼티인
[[Environment]]
를 갖고 있는데 여기에 함수가 만들어진 곳의 렉시컬 환경에 대한 참조가 저장됨
var value = "value1"; function printValue() { return value; } function printFunc(func) { var value = "value2"; console.log(func()); } printFunc(printValue);
- 콘솔로 찍히는 value 값은?
value1 - 동작 방식
- 코드에서 변수에 접근할 때 내부의 렉시컬 환경을 검색범위로 잡음
- 내부 렉시컬 환경에 원하는 변수가 없는 경우, 검색 범위를 내부 렉시컬 환경이 참조하는 외부 렉시컬 환경으로 확장 → 스코프 체인
- 검색 범위가 전역 렉시컬 환경이 될 때까지 1, 2 동작을 반복
- 전역 렉시컬에도 변수를 찾지 못하면, 엄격 모드에선 에러가 발생.
Go toor?