코드를 실행할 때 필요한 배경이 되는 조건/환경
→ 실행컨텍스트는 함수를 실행할 때 필요한 환경 정보를 담은 객체이다.
동일환 조건/환경을 지니는 코드 뭉치를 실행할 때 필요한 조건/환경정보
결론 : 해당 조건 전부 함수이다.
단) if/for/switch/while...'문'? → 블록스코프
ES6에서 블록스코프 개념이 추가되면서let과const에 대해서 별개의 독립된 역할을 하고는 있지만 별개의 실행 컨텍스트를 생성하지 않는다.
최종 결론 : 자바스크립트는 오직 함수에 의해서만 컨텍스트를 구분할 수 있다는 점이다.
현재 어떤 함수가 동작중인지 다음에 어떤 함수가 호출될 예정인지 등을 제어하는 자료구조

Variable Environment 와 Lexical Environment의 차이는 값의 변화가 실시간으로 반영되느냐 그렇지 않느냐의 차이가 있다.
실행컨텍스트를 구성하는 환경 정보들을 모아 사전처럼 구성한 객체
예시) 📝실행 컨텍스트 A 환경 사전
- 내부 식별자 a : 현재 값은 undefined 이다.
- 내부 식별자 b : 현재 값은 20이다.
- 외부 정보 : D를 참조한다.
현재 문맥의 식별자 정보가 수집된다.
실행 컨텍스트가 최초 실행 될 때 제일 먼저 하는 일 environmentRecord이다.
✨ 수집과정에서 발생하는 현상을 좀 더 쉽게 생각할 수 있는 다른 방법이 있다.
→ 현재 컨텍스트 식별자 정보를 수집해서 environmentRecord에 담는 과정 이 수집 과정을 호이스팅(식별자 정보를 끌어 올린다)이라고 한다.

호이스팅은 함수 선언문은 전체를 끌어 올린다.
현재 문맥에 관련 있는 외부 식별자 정보

inner 함수에서 선언한 변수는 outer 함수에서 접근할 수 없다.
왜냐하면 outer 함수에는 inner 함수의 LexicalEnvironment에 대한 접근할 수 있는 수단이 없다.(참조하고 있는 대상이 없다.)
inner 컨텍스트에서 선언한 변수는 environmentRecord에 의해서 접근할 수 있다. outerEnvironmentReference를 통해서 outer함수의 LexicalEnvironment 정보에도 접근할 수 있다.
❗️위 사진 참고
1. inner 함수에서 "어떤 변수를 찾아라"라고 명령
2. 일단 environmentRecord에서 해당 변수가 있는지 찾는다.
3. 만약 inner에 없다면 outerEnvironment Reference를 타고 outer함수 environmentRecord에서 변수를 찾는다.
4. outer에도 해당 변수가 없다면 outerEnvironmentReference를 타고 전역 컨텍스트에가서 전역컨텍스트에 environmentRecord에서 해당 변수를 찾는다.
이러한 과정이 SCOPE CHAIN이다.
inner함수에서 a를 찾는다
하지만 inner함수에는 a가 없다. 그리고 outer함수에 a=2 전역컨텍스트에는 a=3있다 그래서 inner함수는 outerEnvironmentReference로 먼저 outer함수가 있기 때문에 a=2가 되게 된다.
정리
가장 가까운 자기 자신부터 점점 멀리 있는 스코프로 찾아 나가는 것
즉 가장 가까운 곳에서 가장 먼저 찾아지는 것만 접근 - shadowing 개념