HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🐣
프론트엔드 데브코스 3기 교육생
/
📚
3기 스터디 가이드
/
🧑‍💻
CS 학습 및 면접대비 스터디
/
🔗
스코프 체인
🔗

스코프 체인

URL
발표자
수화
과목
Javascript

실행컨텍스트 execution context

  • js 코드를 실행하는데 필요한 환경을 제공하는 객체
  • 실행컨텍스트 생성 → 실행
    • 생성과정 : 선언문만 실행해서 환경레코드에 기록 (실행 때 참조함) → 사이드 이펙트로 호이스팅
    • (오해하지말기) var만 호이스팅 되는 게 아니다!
      • let, const도 function, class 모두 선언문은 호이스팅이 일어난다.
        let, const 선언라인 이전 호출 시, 참조에러가 나는 것은 TDZ(변수 초기화 전)에 있기때문
        console.log(a); // ReferenceError: Cannot access 'a' before initialization let a = 5;

실행컨텍스트가 만들어지는 기준은 뭘까? → 뇌피셜

무엇일까요?

ES6 이전 : function scope

그래서 var(변수선언 키워드)도 함수 스코프를 따랐던 거 같네요.

ES6 : block scope

{ } 기준
함수 스코프를 따른 var 대신 let, const 탄생 !
→ if, for문에서도 실행컨텍스트가 생긴다

scope

참조가능한 유효범위
 
 

아니, 근데 동일한 변수명이 있을 땐 어떻게 식별하지?

 
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();
 
notion image

스코프 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();

코드 동작과정

1️⃣
buyMacBook 함수실행 시, 실행컨텍스트 콜스택에 쌓인다
2️⃣
현재 실행컨텍스트와 전역 스코프(전역객체)를 바인딩한다.
3️⃣
현재 실행컨텍스트와 상위 스코프(workHard 함수)를 바인딩한다.
4️⃣
현재 실행컨텍스트와 자신의 스코프(활성객체)를 바인딩한다.
5️⃣
buyMacBook 스코프에서 nextTripPlan을 찾는다.
6️⃣
상위 스코프로 이동해 nextTripPlan을 찾는다.
💎
찾았다 ["바르셀로나", "뉴질랜드", "캐나다"]
 
notion image
 

정리

  • 스코프 체인은 식별자 결정의 메커니즘이다 (=식별자를 찾아보는 순서)
  • 스코프 체인은 실행컨텍스트에 연결되어있다.
  • 실행컨텍스트가 콜스택에 쌓이고, 전역/상위/자신 스코프를 바인딩한다.
  • js엔진이 코드를 실행할 때, 실행컨텍스트를 참조해 식별자를 찾아낸다.
 

추가

클로저를 어디에 쓰는걸까?

great-sid-gvbtks
great-sid-gvbtks by suhwa using parcel-bundler
great-sid-gvbtks
https://codesandbox.io/s/great-sid-gvbtks?file=/src/index.js
great-sid-gvbtks
장점
  • 전역변수 사용 줄일 수 있음
  • 상태값 정보 은닉 → 상태값 관리 가능
  • 더 자세한건 함수형 프로그래밍
 
주의할 점,
자바스크립트는 참조하지 않는 값을 자동적으로 메모리 해제시킨다. 불필요한 클로저를 만들어놓을 경우, 누군가는 참조하고 있기에 메모리 해제 X
→ 꼭 클로저를 써야만하는지 생각하기 **
 
 
 

참고자료 📑

Closure | PoiemaWeb
클로저(closure)는 자바스크립트에서 중요한 개념 중 하나로 자바스크립트에 관심을 가지고 있다면 한번쯤은 들어보았을 내용이다. execution context 에 대한 사전 지식이 있으면 이해하기 어렵지 않은 개념이다. 클로저는 자바스크립트 고유의 개념이 아니라 함수를 일급 객체로 취급하는 함수형 프로그래밍 언어(Functional Programming language: 얼랭(Erlnag), 스칼라(Scala), 하스켈(Haskell), 리스프(Lisp)...)에서 사용되는 중요한 특성이다.
Closure | PoiemaWeb
https://poiemaweb.com/js-closure
Closure | PoiemaWeb