코드 블록, 함수, 스크립트를 실행하기 앞서 실행할 스코프 범위 안에 있는 변수와 함수를 프로퍼티와 메서드로 저장하는 자료구조이며 실행 컨텍스트를 구성하는 컴포넌트다.
간단히 말하면, 렉시컬 환경은 생성자-변수 매핑을 보유한 구조이다.
실행 컨텍스트 스택이 코드의 실행 순서를 관리한다면 렉시컬 환경은 스코프와 식별자를 관리한다.
실행 컨텍스트(Execution Context)
JavaScript 코드 블록이 평가 및 실행되는 환경의 추상적인 개념이다.
실행 컨텍스트 스택
자바스크립트 엔진이 작성된 스크립트를 처음 마주할 때, 전역 실행 컨텍스트를 생성하고, 현재 실행 스택에 push 한다. 엔진이 함수 호출을 발견 할 때마다, 함수를 위한 새로운 실행 컨텍스트를 생성하고 스택의 꼭대기에 push 한다.
엔진은 스택 최상단에 있는 함수의 실행 컨텍스트를 실행한다. 이 함수가 완료되면 해당 함수의 실행 스택이 현 스택에서 pop 되고 그 아래 실행 컨텍스트에 도달한다.
이처럼 실행 컨텍스트 스택은 코드의 실행 순서를 관리한다.
function makeCounter() {
let count = 0;
return function() {
return count++;
};
}
let counter = makeCounter();
console.log(counter()); // 0
console.log(counter()); // 1
console.log(counter()); // 2
console.log(makeConter()()); // 0
console.log(makeConter()()); // 0
console.log(makeConter()()); // 0
스코프에 포함된 식별자를 등록하고 식별자에 바인딩 된 값(변수,함수)을 관리하는 저장소
이름에서 알수 있듯, 변수와 함수 선언 저장을 뜻한다. 함수 코드를 위한 렉시컬 환경은 렉시컬 환경 레코드를 포함한다.
전변수, 함수 선언과 별개로, 객체 환경 레코드는 전역 바인딩 객체(브라우저의 window 객체)를 저장한다. 그래서 각 바인딩 객체의 프로퍼티에 대해 레코드에 새로운 항목이 생성된다.
상위 스코프를 가리킨다. 이때 상위 스코프란 외부 렉시컬 환경, 즉 실행 컨텍스트를 생성한 소스코드를 포함하는 상위 코드의 렉시컬 환경을 말한다. 이를 통해 단방향 링크드 리스트인 스코프체인을 구현한다.
this의 값은 전역 객체를 참조한다.
this의 값은 함수가 어떻게 호출되는지에 달렸다.
만약 객체 참조로부터 호출되면, this의 값은 해당 객체로 set 되고,
그렇지않을 경우 전역 객체 또는 undefined(strict 모드)로 set 된다.