실행컨텍스트 execution context
- js 코드를 실행하는데 필요한 환경을 제공하는 객체
- 실행컨텍스트 생성 → 실행
- 생성과정 : 선언문만 실행해서 환경레코드에 기록 (실행 때 참조함) → 사이드 이펙트로 호이스팅
- (오해하지말기) var만 호이스팅 되는 게 아니다!
let, const도 function, class 모두 선언문은 호이스팅이 일어난다.
let, const 선언라인 이전 호출 시, 참조에러가 나는 것은 TDZ(변수 초기화 전)에 있기때문
console.log(a); // ReferenceError: Cannot access 'a' before initialization let a = 5;
실행컨텍스트가 만들어지는 기준은 뭘까? → 뇌피셜
무엇일까요?
아니, 근데 동일한 변수명이 있을 땐 어떻게 식별하지?
let myMoney = 0; console.log(`global myMoney`, myMoney); const buyMacBook = () => { let myMoney = 5000000; console.log(`after buying a MacBook, myMoney`, myMoney); }; const workHard = () => { let myMoney = 9000000; console.log(`after working hard, myMoney`, myMoney); buyMacBook(); }; workHard();

스코프 scope, 유효범위
- 스코프는 특정 변수를 참조할 수 있는 유효범위
- 즉, 변수는 스코프 내에서만 참조할 수 있다.
- Js는 Block문 기준으로 스코프가 생긴다.
스코프 체인
- 식별자 결정의 메커니즘
- 현재 스코프에 없는 변수를 참조하는 방법
const hello = "suhwa, hello"; const myMoney = 0; console.log(`global myMoney`, myMoney); // 0 const workHard = () => { const myMoney = 9000000; const nextTripPlan = ["바르셀로나", "뉴질랜드", "캐나다"]; console.log(`after working hard, myMoney`, myMoney); // 9000000 console.log(hello); // suhwa, hello const buyMacBook = () => { const myMoney = 500000; console.log(`after buying a MacBook, myMoney`, myMoney); // 5000000 console.log(nextTripPlan); }; buyMacBook(); }; // [1] workHard();

정리
- 스코프 체인은 식별자 결정의 메커니즘이다 (=식별자를 찾아보는 순서)
- 스코프 체인은 실행컨텍스트에 연결되어있다.
- 실행컨텍스트가 콜스택에 쌓이고, 전역/상위/자신 스코프를 바인딩한다.
- js엔진이 코드를 실행할 때, 실행컨텍스트를 참조해 식별자를 찾아낸다.
추가
클로저를 어디에 쓰는걸까?
장점
- 전역변수 사용 줄일 수 있음
- 상태값 정보 은닉 → 상태값 관리 가능
- 더 자세한건 함수형 프로그래밍
주의할 점,
자바스크립트는 참조하지 않는 값을 자동적으로 메모리 해제시킨다.
불필요한 클로저를 만들어놓을 경우, 누군가는 참조하고 있기에 메모리 해제 X
→ 꼭 클로저를 써야만하는지 생각하기 **