
자바스크립트 엔진이 변수와 함수 선언을 저장하는 내부 데이터 구조이다
= 렉시컬 스코프를 구현하는 방식이며, 변수와 함수 식별자가 저장되는 객체 형태의 구조이다.
렉시컬 환경이 스코프 체인을 형성하여 렉시컬 스코프를 구현합니다.
= 렉시컬 환경이 없으면 렉시컬 스코프를 구현할 수 없다

✔️환경 레코드(environment record) → 호이스팅과 관련
식별자, 식별자에 바인딩된 값을 기록
→ 호이스팅 발생했을 때 렌더링 전에 어딘가에 미리 기록하는 곳이 환경레코드이다
- 생성단계: 본격적인 실행에 앞서 스캔하고 준비하는 단계
실행컨텍스트를 생성하고, 선언문만 먼저 실행해서 환경레코드에 미리 기록
- 실행단계: 선언문 외 나머지 코드 순차적 실행
필요한 경우 환경레코드에 미리 기록해둔 정보를 참고하거나 업데이트한다.
✔️외부 렉시컬 환경 → 클로저와 관련
렉시컬 환경의 부모 렉시컬 환경이다
환경 레코드에서 먼저 찾고, 찾지 못하면 렉시컬 환경이 가지고 있는 외부 렉시컬 환경에 대한 참조
클로저란, 중첩 함수에서 어떤 함수가 자신(함수)의 외부에서 선언된 지역 변수를 참조하도록 선언되어,
외부 실행 컨텍스트가 종료되었음에도 불구하고 그 Lexical Environment 정보가 남아 있어 이에 접근할 수 있는 함수 또는 그 현상
✔️[[Environment]]
내부 숨김 연관 객체를 가진다
모든 함수가 가지고 있는 내부 프로퍼티
함수가 만들어질 때 그 함수를 둘러싼 외부 렉시컬 환경에 대한 참조 저장한다
스크립트 전체와 관련된 렉시컬 환경 = 전역 렉시컬 환경
전역 렉시컬 환경 = 외부 참조를 갖지 않는다
모든 함수는 함수가 생성된 곳의 렉시컬 환경을 기억한다
왜냐하면 함수는 [[enviroment]] 불리는 숨김 프로퍼티 갖고 있다
여기에서 함수가 만들어진 곳의 렉시컬 환경에 대한 참조가 저장된다
그렇기 때문에 호출 장소와 상관없이 함수가 자신이 태어난 곳을 기억할 수 있었던 게 environment 프로퍼티 덕분이다
자바스크립트는 렉시컬 환경 위에서 실행
물론 코드 자체는 렉시컬 환경이 생성되기 전에도 존재할 수 있다
하지만, 실행 후는 렉시컬 환경 위에서 이루어지는 것
https://ko.javascript.info/browser-environment
DOM 브라우저만을 위한 모델이 아니다
브라우저가 아닌 곳에서도 DOM을 사용하는 경우가 있다

BOM은 문서 이외 모든 것을 제어하기 위해 브라우저가 제공하는 추가 객체