스코프 체인
스코프
식별자
의 유효범위
- 스코프가 필요한 이유
- 같은 변수명끼리 값을 받아 오는 것에 있어 충돌을 방지
- 효율적 메모리 관리, 코드 블럭 안에 참조값 들은 실행 될 때만 메모리에 할당되는 것이 효율적
- 스코프는 필요한 영역에 한정하여 유효 범위가 좁을수록 좋다.
스코프 체인
- 자신이 속해있는 지역의 변수들을 참조할 수 있고 만약 그 참조값이 없다면
상위 레벨의 스코프
로 올라가면서 해당 참조 값을 찾는 것
- 전역 스코프에도 찾는 참조 값이 없다면
null
반환
let value = "전역 스코프"; function a() { let value = "a 스코프"; b(); function b() { let value = "b 스코프"; c(); function c() { let value = "c 스코프"; console.dir(c); console.log(value); } } } a(); // 기존 => "c 스코프" // c 함수 스코프에 value가 없다면 => "b 스코프" // b 함수 스코프에 value가 없다면 => "a 스코프" // a 함수 스코프에 value가 없다면 => "전역 스코프" // 전역 스코프에 value가 없다면 => ReferenceError: value is not defined
- 스코프 체인 확인 ⇒ 자신의 스코프를 제외한 자신과 가장 가까운 변수 객체의 모든 스코프
function a() { console.dir(a); b(); function b() { console.dir(b); c(); function c() { console.dir(c); } } } a();

정적 / 렉시컬 스코프(Static / Lexical Scope)
- 함수를 어디서 호출하는지가 아니라 어디에 선언하였는지에 따라 결정된다.
let greet = 'Hello'; function sayHi() { let greet = 'Hi'; print(); } function print() { console.log(greet); } sayHi(); // 예상: "Hi" | 출력값: "Hello" print(); // 예상: "Hello" | 출력값: "Hello"