렉시컬 환경
- 식별자와 스코프의 실행 컨텍스트 관리
- 식별자와 식별자에 의해 바인딩된 값
- 상위 스코프에 대한 참조를 기록하는 자료구조
- 실행 컨텍스트를 구성하는 컴포넌트
- 함수가 실행될 때 렉시컬 환경이 구성됨
- 렉시컬 환경은 환경레코드, 외부렉시컬 환경으로 구성
렉시컬 환경 객체
- 환경 레코드
- 모든 지역 변수를 프로퍼티로 저장하고 있는 객체
- this 값과 같은 기타 정보도 여기에 저장
- 외부 렉시컬 환경
- 현재 렉시컬 환경보다 더 상위의 렉시컬 환경
- 현재 렉시컬 환경보다 더 상위의 렉시컬 환경
렉시컬 환경
function makeCounter() {
let count = 0;
return function() {
return count++;
};
}
# 중첩된 함수를 여러 번 호출할 때에 하나의 makeCounter() 함수를 외부 렉시컬 환경으로 참조하므로 count가 증가 된 값들이 반영
let counter = makeCounter();
console.log(counter()); // 0
console.log(counter()); // 1
console.log(counter()); // 2
# 3개의 고유한 렉시컬 환경(makeCounter)이 만들어지고 중첩된 함수는 각각의 서로 다른 외부 렉시컬 환경(makeCounter)을 참조
console.log(makeConter()()); // 0
console.log(makeConter()()); // 0
console.log(makeConter()()); // 0
변수
- '변수'는 특수 내부 객체인 환경 레코드의 프로퍼티.
- 변수를 가져오거나 변경하는 것 = 환경 레코드의 프로퍼티를 가져오거나 변경 함.
함수 선언문
- 함수 선언문으로 선언한 함수는 일반 변수와 달리 바로 초기화
- 함수 선언문으로 선언한 함수는 렉시컬 환경이 만들어지는 즉시 사용할 수 있음
- 렉시컬 환경엔 함수 호출 시 넘겨 받은 매개변수와 함수의 지역 변수가 저장
- 함수가 호출 중인 동안엔 호출 중인 함수를 위한 내부 렉시컬 환경과 내부 렉시컬 환경이 가리키는 외부 렉시컬 환경을 갖게 됨
내부와 외부 렉시컬 환경
- 내부 렉시컬 환경은 외부 렉시컬 환경에 대한 참조를 갖고 있음
- 코드에서 변수에 접근할 땐, 먼저 내부 렉시컬 환경을 검색 범위로
- 내부 렉시컬 환경에서 원하는 변수를 찾지 못하면 검색 범위를 외부 렉시컬 환경으로 확장 ( 검색 범위가 전역 렉시컬 환경으로 확장될 때까지 반복)
- 전역 렉시컬 환경에 도달할 때까지 변수를 찾지 못하면 엄격 모드에선 에러가 발생
- 비 엄격 모드에선 정의되지 않은 변수에 값을 할당하려고 하면 에러가 발생하는 대신 새로운 전역 변수가 만들어지는데, 이는 하위 호환성을 위해 남아있는 기능
[[Environment]] 프로퍼티
- 호출 장소와 상관없이 함수가 자신이 태어난 곳을 기억
- [[Environment]]는 함수가 생성될 때 딱 한 번 값이 세팅되고 영원히 변하지 않음
- 이 렉시컬 환경은 counter.[[Environment]]에 저장된 렉시컬 환경을 외부 렉시컬 환경으로서 참조
실행 컨텍스트 스택: 코드 실행 순서 관리
- 실행 컨텍스트 스택 최상위에 존재하는 실행 컨텍스트는 언제나 현재 실행중인 코드의 실행 컨텍스트
- 실행컨텍스트 최상위에 존재하는 실행 컨텍스트 => 실행 중인 실행 컨텍스트
'Javascript' 카테고리의 다른 글
클로저 (0) | 2023.01.06 |
---|---|
실행 컨텍스트 (0) | 2023.01.06 |
스코프 (0) | 2023.01.06 |
블록레벨스코프와 함수레벨스코프 (0) | 2022.07.27 |
ES6 특징 (0) | 2022.07.26 |