LogoSEO Jing
  • All Posts
  • SEO Jing
  • okayJing
  • KD Team
  • CLAB Coreteam
  • Study

Contact Me

© 2026 SEOJing. All rights reserved.

자바스크립트 퀴즈북 리마인드 Day 6: 스코프 체인과 호이스팅

2026년 6월 28일·2분 읽기
예상 읽기 시간: 12분
오늘의 질문: “콜백 안에서 읽는 값은 함수가 만들어진 곳을 볼까, 호출된 곳을 볼까?”

먼저 맞혀보기

js
const label = "global";

function makeLogger() {
  const label = "local";
  return function log() {
    console.log(label);
  };
}

const log = makeLogger();
log();

출력은 local입니다. 함수는 호출된 위치가 아니라 생성된 위치의 렉시컬 환경을 기억합니다. 이게 스코프 체인과 클로저의 핵심입니다.

틀리기 쉬운 직감

“나중에 실행됐으니까 그때 주변 값을 보겠지”라고 생각하면 비동기 콜백, 이벤트 핸들러, React effect에서 자주 틀립니다. 자바스크립트 함수는 실행 시점마다 아무 스코프나 다시 고르지 않습니다. 함수 객체가 만들어질 때 바깥 환경 참조가 함께 붙고, 실행 때는 그 참조를 따라 이름을 찾습니다.

스코프 체인과 호이스팅 관계

`var`와 `let/const`의 차이

둘 다 선언은 스코프의 시작 지점에서 준비됩니다. 차이는 “읽을 수 있는가”입니다.

선언선언 전 읽기스코프리뷰 포인트
varundefined함수루프·콜백에서 같은 바인딩을 공유하기 쉽다
letTDZ 에러블록선언 순서가 의도를 더 잘 드러낸다
constTDZ 에러블록재할당 금지이지 객체 불변은 아니다
js
console.log(a); // undefined
var a = 1;

console.log(b); // ReferenceError
let b = 1;

var가 “안전”한 게 아닙니다. 오히려 버그를 조용히 숨길 수 있습니다. 리뷰할 때는 undefined가 의도된 값인지, 선언 순서가 읽는 사람에게 명확한지 확인해야 합니다.

프론트엔드 리뷰에서 보는 부분

이벤트 핸들러가 오래된 상태를 닫아두고 있지 않은가? 루프 안 콜백이 같은 var 바인딩을 공유하지 않는가? const 객체를 내부에서 바꾸면서 불변처럼 말하고 있지 않은가? 선언보다 사용이 먼저 나와서 TDZ나 undefined 흐름을 만들지 않는가?

스코프 체인은 문법 지식보다 “이 함수가 어떤 값을 기억하고 실행되는지”를 추적하는 도구에 가깝습니다.

Quiz1 / 3
Q.첫 번째 예제의 출력은?

Post Q&A

오케이징에게 물어보기

자바스크립트 퀴즈북 리마인드 Day 6: 스코프 체인과 호이스팅 전체를 기준으로 질문과 피드백을 받아요.답을 본 뒤에는 이 내용을 댓글로 달아서 서징에게도 물어볼 수 있어요. 작성자가 직접 볼 수 있어요!

0/500

포스트 목록

/study/javascript-quizbook
파일 7개, 폴더 0개
자바스크립트 퀴즈북 리마인드 Day 1: 숫자는 왜 가끔 믿을 수 없을까자바스크립트 퀴즈북 리마인드 Day 2: 같은 값인지 묻는 네 가지 방법자바스크립트 퀴즈북 리마인드 Day 3: + 연산자와 ToPrimitive 흐름자바스크립트 퀴즈북 리마인드 Day 4: 프로퍼티 descriptor와 freeze의 경계자바스크립트 퀴즈북 리마인드 Day 5: 참조, 복사, Map/Set의 메모리 감각자바스크립트 퀴즈북 리마인드 Day 6: 스코프 체인과 호이스팅자바스크립트 퀴즈북 리마인드 Day 7: 클로저 버그와 오래된 값

같은 섹션의 대표 이미지

7 posts · latest first
클로저가 생성 위치의 바인딩을 기억해 나중 실행에서 오래된 값을 읽을 수 있음을 보여주는 다이어그램
Study26. 06. 29.

자바스크립트 퀴즈북 리마인드 Day 7: 클로저 버그와 오래된.

클로저가 값 복사가 아니라 렉시컬 환경 참조라는 점을 stale closure, 루프 콜백, React 이벤트 리뷰 관점에서 정리합니다.

26. 06. 29.SEOJing
스코프 체인과 호이스팅 관계를 단순화한 다이어그램
Study26. 06. 28.

자바스크립트 퀴즈북 리마인드 Day 6: 스코프 체인과 호이스팅.

스코프 체인, 클로저, var/let/const 호이스팅 차이를 콜백·상태 버그 리뷰 관점에서 짧게 정리합니다.

26. 06. 28.SEOJing
JavaScript 객체 참조와 Map, Set, WeakMap의 참조 구조를 비교한 다이어그램
Study26. 06. 27.

자바스크립트 퀴즈북 리마인드 Day 5: 참조, 복사,.

객체 참조와 얕은 복사, Object와 Map/Set의 차이, WeakMap/WeakSet이 필요한 메모리 상황을 프론트엔드 코드 리뷰 관점에서 정리합니다.

26. 06. 27.SEOJing
JavaScript 프로퍼티 descriptor가 data descriptor와 accessor descriptor로 갈라지는 구조 다이어그램
Study26. 06. 26.

자바스크립트 퀴즈북 리마인드 Day 4: 프로퍼티.

객체 프로퍼티를 key/value가 아니라 descriptor로 읽는 법, getter/setter와 defineProperty, preventExtensions/seal/freeze의 경계를 코드 리뷰 관점에서 정리합니다.

26. 06. 26.SEOJing
객체가 ToPrimitive를 거쳐 + 연산자의 문자열 연결 또는 숫자 덧셈으로 갈라지는 흐름 다이어그램
Study26. 06. 25.

자바스크립트 퀴즈북 리마인드 Day 3: + 연산자와.

객체가 원시값으로 바뀌는 ToPrimitive 흐름, + 연산자의 문자열 연결과 숫자 덧셈 분기, Symbol.toPrimitive가 코드 리뷰에서 왜 중요한지 정리합니다.

26. 06. 25.SEOJing
==, ===, Object.is, SameValueZero의 차이를 정리한 JavaScript equality 다이어그램
Study26. 06. 24.

자바스크립트 퀴즈북 리마인드 Day 2: 같은 값인지 묻는 네.

==, ===, Object.is, SameValueZero가 각각 어떤 비교 알고리즘을 쓰는지 정리하고, includes와 indexOf, Map/Set 키 비교에서 생기는 프론트엔드 리뷰 포인트를 잡습니다.

26. 06. 24.SEOJing
JavaScript Number, safe integer, NaN, -0, BigInt를 한 장으로 정리한 다이어그램
Study26. 06. 23.

자바스크립트 퀴즈북 리마인드 Day 1: 숫자는 왜 가끔 믿을.

자바스크립트의 Number가 왜 정수처럼 보여도 부동소수점 모델 위에서 움직이는지, NaN과 -0, safe integer, BigInt를 프론트엔드 코드 리뷰 관점에서 다시 정리합니다.

26. 06. 23.SEOJing