← 글 목록

notes

13장. 스코프

모던 JS Deep Dive — 스코프 체인·식별자 검색과 렉시컬 환경 정리.

참고: 이웅모 《모던 자바스크립트 Deep Dive》 13장 · 보강: MDN Grammar and types / Closures

프로젝트를 하다 보면 const랑 var를 섞어 쓰다가 “왜 여기선 되고 저기선 안 되지?”가 반복된다. 팀원들은 스코프 이야기를 자연스럽게 하는데, 나는 사용법만 외운 느낌이 있었다. 알고 쓰니? 솔직히 반쯤 아니요. Deep Dive 13장 + MDN을 같이 보며 헷갈림→찾아봄→정리로 적는다.

처음에 뭐가 헷갈렸냐

같은 이름 x가 두 군데면 덮어쓰는 건지 따로 사는 건지. “호출 위치” vs “작성 위치”가 머릿속에서 싸웠다. 이게 무슨 말이냐.

찾아봄

JS는 렉시컬 스코프. 작성 위치가 상위 스코프를 정하고, 호출 위치는 안 본다. this(22장, 호출 방식)와 축이 다르다. MDN도 lexical = 소스상 위치라고 한다.

비유

스코프 = 아파트 동·호수. 동 다르면 같은 호수도 남의 집. 이름도 스코프 다르면 다른 저장 공간. 칸막이 = 네임스페이스.

전역과 지역

전역=로비, 지역=회의실. 안은 체인으로 바깥을 볼 수 있고, 바깥은 안을 못 본다.

예제 1 — 다른 집

var x = 'global';
function foo() {
  var x = 'local';
  console.log(x); // local
}
foo();
console.log(x); // global

착각: 덮어쓴다. 진실: 다른 변수.

스코프 체인

현재→바깥→…→전역. 없으면 ReferenceError. 안쪽부터 찾는다.

예제 2 — 체인

function outer() {
  const msg = 'hi';
  function inner() { console.log(msg); }
  return inner;
}
outer()(); // hi

끝난 뒤에도 살아 있으면 24장 클로저.

var = 함수 레벨

블록이 칸이 아님. if 안 var가 함수로 샘 → let/const(15장).

예제 3 — 누수

function demo(flag) {
  if (flag) { var leaked = 1; }
  console.log(typeof leaked);
}

렉시컬 증명

예제 4

var x = 1;
function foo() { console.log(x); }
function bar() {
  var x = 10;
  foo(); // 1
}
bar();

표

질문→자답

스코프 vs 실행컨텍스트? 지도 vs 지금 방(23). 화살표 스코프 특수? 스코프 같고 this만 특수. 모듈에서 전역 안 보임? 모듈 칸.

오늘 지운 미신

호출 위치가 스코프를 바꾼다 → 작성 위치다.

웹 보강 메모

MDN을 옆에 두고 콘솔에 예제를 옮겨 적었다. 책만 보면 “알 것 같은” 느낌이 남고, 손으로 실행해야 미신이 떠난다. Flux/Proxy 노트 쓸 때랑 같은 루틴이다. 헷갈리면 먼저 “이게 무슨 말이냐”를 쓰고, 비유를 만들고, 표로 닫는다. 원문 복붙은 안 한다. 내 실패만 남긴다.

실무 적용: 오늘 작성 중인 모듈 하나에 이 장 기준을 즉시 적용해 본다. 노션에만 있으면 지식 아님. 체크리스트에 한 줄 내려야 팀 자산이다.

추가 자문: 이 개념이 버그 클래스 중 무엇을 줄이는가? 가시성? 수명? 공유? 호출 규약? 질문이 나뉘면 디버깅이 빨라진다. 그래서 일기를 길게 쓴다.