[JavaScript] λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(Lexical scope) μ•Œμ•„λ³΄κΈ°

2025. 8. 28. 20:55Β·πŸ“š ν”„λ‘ νŠΈμ—”λ“œ/Javascript

이번 κΈ€μ—μ„œλŠ” λ ‰μ‹œμ»¬ μŠ€μ½”ν”„κ°€ 무엇이고,

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ 정리해보렀고 ν•œλ‹€.

 

🧐 μŠ€μ½”ν”„λž€ λ¬΄μ—‡μΌκΉŒ?

μŠ€μ½”ν”„(Scope)λŠ” λ³€μˆ˜λ‚˜ ν•¨μˆ˜μ— μ ‘κ·Όν•  수 μžˆλŠ” 유효 λ²”μœ„λ₯Ό μ˜λ―Έν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  λ³€μˆ˜λŠ” μžμ‹ λ§Œμ˜ 유효 λ²”μœ„λ₯Ό κ°€μ§€λ©°,

이 λ²”μœ„λ₯Ό κ²°μ •ν•˜λŠ” κ·œμΉ™μ΄ λ°”λ‘œ λ ‰μ‹œμ»¬ μŠ€μ½”ν”„μ΄λ‹€.

 

μŠ€μ½”ν”„λŠ” 크게 두 κ°€μ§€λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.

  • μ „μ—­ μŠ€μ½”ν”„ (Global Scope): μ½”λ“œ μ–΄λ””μ—μ„œλ“  μ ‘κ·Όν•  수 μžˆλŠ” κ°€μž₯ λ°”κΉ₯ λ²”μœ„
  • μ§€μ—­ μŠ€μ½”ν”„ (Local Scope): ν•¨μˆ˜λ‚˜ 블둝({ }) 내뢀에 μ„ μ–Έλ˜μ–΄ κ·Έ μ•ˆμ—μ„œλ§Œ μœ νš¨ν•œ λ²”μœ„
    • ν•¨μˆ˜ μŠ€μ½”ν”„ (Function Scope): ν•¨μˆ˜ λ‚΄μ—μ„œλ§Œ 유효 (var)
    • 블둝 μŠ€μ½”ν”„ (Block Scope): { } 블둝 λ‚΄μ—μ„œλ§Œ 유효 (let, const)
const globalName = 'Alice'; // μ „μ—­ μŠ€μ½”ν”„

function sayHello() {
  const localName = 'Bob'; // μ§€μ—­ μŠ€μ½”ν”„ (ν•¨μˆ˜ μŠ€μ½”ν”„)
  console.log(`Hello, ${globalName}`); // βœ… μ „μ—­ λ³€μˆ˜ μ ‘κ·Ό κ°€λŠ₯
  console.log(`Hello, ${localName}`); // βœ… μ§€μ—­ λ³€μˆ˜ μ ‘κ·Ό κ°€λŠ₯
}

sayHello();

// ν•¨μˆ˜ μŠ€μ½”ν”„ λ°–μ—μ„œλŠ” μ§€μ—­ λ³€μˆ˜μ— μ ‘κ·Όν•  수 μ—†μŒ
console.log(localName); // ReferenceError: localName is not defined

 

πŸ’‘ 주의: varλŠ” 블둝 μŠ€μ½”ν”„λ₯Ό λ¬΄μ‹œν•œλ‹€.

→ 블둝(if, for) μ•ˆμ—μ„œ 선언해도 λ°”κΉ₯μ—μ„œ μ ‘κ·Ό κ°€λŠ₯

var ν‚€μ›Œλ“œμ™€ κ΄€λ ¨λœ λ‚΄μš©μ€ ν•΄λ‹Ή 글을 μ°Έκ³ 

if (true) {
  var x = 10;  // ν•¨μˆ˜ μŠ€μ½”ν”„
  let y = 20;  // 블둝 μŠ€μ½”ν”„
}

console.log(x); // 10
console.log(y); // ReferenceError

 

πŸ—ΊοΈ λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λž€?

λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(Lexical Scope)λŠ”

μ½”λ“œκ°€ μž‘μ„±λœ μœ„μΉ˜(μ •μ˜λœ μœ„μΉ˜)에 따라 μŠ€μ½”ν”„κ°€ κ²°μ •λ˜λŠ” κ·œμΉ™μ„ μ˜λ―Έν•œλ‹€.

 

λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λŠ” μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° μ „, μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³  λΆ„μ„ν•˜λŠ” λ‹¨κ³„μ—μ„œ

이미 μ •μ μœΌλ‘œ(Static) κ²°μ •λ˜κΈ° λ•Œλ¬Έμ— 정적 μŠ€μ½”ν”„(Static Scope)라고 λΆˆλ¦¬κΈ°λ„ ν•œλ‹€.

 

λ‹€μ‹œ λ§ν•΄μ„œ μ½”λ“œκ°€ μ–΄λ””μ„œ ν˜ΈμΆœλ˜λŠ”μ§€κ°€ μ•„λ‹ˆλΌ

μ–΄λ””μ„œ μ •μ˜λ˜μ—ˆλŠ”μ§€κ°€ μ€‘μš”ν•˜λ‹€λΌλŠ” μ˜λ―Έμ΄λ‹€.

 

🏠 λ ‰μ‹œμ»¬ μŠ€μ½”ν”„ μ˜ˆμ‹œ

  • ν•¨μˆ˜ = μ§‘: 각각의 ν•¨μˆ˜λŠ” λ…λ¦½λœ μ§‘
  • λ‚΄λΆ€ μŠ€μ½”ν”„ = 우리 μ§‘ μ•ˆ: 우리 μ§‘μ—μ„œλŠ” μ§‘ μ•ˆμ˜ 물건(λ‚΄λΆ€ λ³€μˆ˜)을 λ§ˆμŒλŒ€λ‘œ λ³΄κ±°λ‚˜ μ“Έ 수 있음
  • μ™ΈλΆ€ μŠ€μ½”ν”„ = 우리 동넀: 우리 μ§‘ λ°–μœΌλ‘œ λ‚˜κ°€λ©΄ 우리 동넀(μ™ΈλΆ€ μŠ€μ½”ν”„)에 μžˆλŠ” κ°€κ²Œ, 곡원(μ™ΈλΆ€ λ³€μˆ˜)λ₯Ό λ³΄κ±°λ‚˜ μ΄μš©ν•  수 있음
  • κ·œμΉ™: λ‚˜λŠ” λ‹€λ₯Έ μ‚¬λžŒ μ§‘ μ•ˆ(λ‚΄λΆ€ μŠ€μ½”ν”„)을 λ§ˆμŒλŒ€λ‘œ λ³Ό 수 μ—†μŒ
const neighborhood = '우리 동넀'; // μ™ΈλΆ€ μŠ€μ½”ν”„

function myHouse() {
  const myRoom = 'λ‚΄ λ°©'; // λ‚΄λΆ€ μŠ€μ½”ν”„

  function lookAround() {
    const desk = 'λ‚΄ 책상';
    console.log(desk); // 'λ‚΄ 책상' (자기 μžμ‹ μ˜ λ³€μˆ˜)
    console.log(myRoom); // 'λ‚΄ λ°©' (μ™ΈλΆ€ ν•¨μˆ˜ λ³€μˆ˜)
    console.log(neighborhood); // '우리 동넀' (μ „μ—­ λ³€μˆ˜)
  }

  lookAround();
}

myHouse();

// λ°–μ—μ„œλŠ” μ§‘ μ•ˆμ„ λ§ˆμŒλŒ€λ‘œ λ³Ό 수 μ—†μŒ
console.log(myRoom); // ReferenceError: myRoom is not defined

 

πŸ›οΈ λ ‰μ‹œμ»¬ μŠ€μ½”ν”„ vs λ ‰μ‹œμ»¬ ν™˜κ²½

λ ‰μ‹œμ»¬ μŠ€μ½”ν”„μ™€ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ 같은 κ°œλ…μ΄λΌκ³  μ˜€ν•΄ν•˜κΈ° μ‰¬μš΄λ°

λ‘˜μ„ κ΅¬λΆ„ν•˜λ©΄ 이해가 훨씬 μ‰¬μ›Œμ§„λ‹€.

  • μŠ€μ½”ν”„ (Scope)
    λ³€μˆ˜μ˜ 유효 λ²”μœ„μ— λŒ€ν•œ 좔상적인 κ·œμΉ™μ΄μž 원칙
  • λ ‰μ‹œμ»¬ ν™˜κ²½ (Lexical Environment)
    μŠ€μ½”ν”„λΌλŠ” κ·œμΉ™μ„ μ‹€μ œλ‘œ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ 엔진이 μ‚¬μš©ν•˜λŠ” ꡬ체적인 객체

즉, μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μŠ€μ½”ν”„ κ·œμΉ™μ„ μ§€ν‚€κΈ° μœ„ν•΄μ„œ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄λΌλŠ” 도ꡬλ₯Ό μ‚¬μš©ν•œλ‹€.

λ ‰μ‹œμ»¬ ν™˜κ²½ κ°μ²΄λŠ” 두 κ°€μ§€ μ£Όμš” μš”μ†Œλ‘œ κ΅¬μ„±λœλ‹€.

  1. ν™˜κ²½ λ ˆμ½”λ“œ (Environment Record)
    ν˜„μž¬ μŠ€μ½”ν”„μ— μ†ν•œ λ³€μˆ˜μ™€ ν•¨μˆ˜ μ‹λ³„μžλ₯Ό κΈ°λ‘ν•˜λŠ” λ‚΄λΆ€ ꡬ쑰
  2. μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½ μ°Έμ‘° (Outer Lexical Environment Reference)
    λ°”κΉ₯ μŠ€μ½”ν”„(λΆ€λͺ¨ λ ‰μ‹œμ»¬ ν™˜κ²½)λ₯Ό κ°€λ¦¬ν‚€λŠ” μ°Έμ‘°
    → 이 μ°Έμ‘°κ°€ μŠ€μ½”ν”„ 체인(Scope Chain)을 ν˜•μ„±ν•¨

 

πŸ•΅οΈ‍♂️ 엔진은 λ³€μˆ˜λ₯Ό μ–΄λ–»κ²Œ μ°Ύμ„κΉŒ?

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 λ³€μˆ˜λ₯Ό μ°ΎλŠ” 과정은 μŠ€μ½”ν”„ 체인을 톡해 이루어진닀.

 

πŸ” λ³€μˆ˜ μ°Έμ‘° κ³Όμ •

  1. ν˜„μž¬ μ‹€ν–‰ 쀑인 μ½”λ“œμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ—μ„œ λ³€μˆ˜λ₯Ό μ°ΎλŠ”λ‹€. (ν™˜κ²½ λ ˆμ½”λ“œ 탐색)
  2. λ§Œμ•½ μ—†μœΌλ©΄, μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½ μ°Έμ‘°λ₯Ό 따라 μƒμœ„ μŠ€μ½”ν”„λ‘œ μ΄λ™ν•œλ‹€.
  3. μƒμœ„ μŠ€μ½”ν”„μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ—μ„œ λ‹€μ‹œ λ³€μˆ˜λ₯Ό μ°ΎλŠ”λ‹€.
  4. 이 과정을 계속 λ°˜λ³΅ν•˜λ‹€κ°€ μ „μ—­ μŠ€μ½”ν”„κΉŒμ§€ λ„λ‹¬ν•œλ‹€.
  5. μ „μ—­ μŠ€μ½”ν”„μ—μ„œλ„ λ³€μˆ˜λ₯Ό μ°Ύμ§€ λͺ»ν•˜λ©΄ ReferenceErrorλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

λ‚΄κ°€ λ§Œλ“¬

μœ„ μ½”λ“œμ—μ„œ innerFuncκ°€ globalVarλ₯Ό μ°ΎλŠ” 과정은 μŠ€μ½”ν”„ 체인을 λͺ…ν™•ν•˜κ²Œ 보여쀀닀.

이처럼 λ‚΄λΆ€ μŠ€μ½”ν”„μ—μ„œ μ‹œμž‘ν•΄ μ™ΈλΆ€ μŠ€μ½”ν”„λ‘œ ν•œ 단계씩 μ˜¬λΌκ°€λ©° λ³€μˆ˜λ₯Ό μ°ΎλŠ” 과정을

μŠ€μ½”ν”„ 체이닝(Scope Chaining)이라고 ν•œλ‹€.

 

πŸ“Œ λ ‰μ‹œμ»¬ μŠ€μ½”ν”„μ™€ this의 차이

  • λ ‰μ‹œμ»¬ μŠ€μ½”ν”„: μ •μ˜λœ μœ„μΉ˜λ₯Ό κΈ°μ€€μœΌλ‘œ λ³€μˆ˜κ°€ 결정됨
  • this: 호좜된 방식에 따라 λ™μ μœΌλ‘œ 결정됨
const obj = {
  name: 'Alice',
  printName: function() {
    console.log(this.name); // ν˜ΈμΆœν•œ 객체에 따라 달라짐
  }
};

function outer() {
  const text = 'Hello';
  function inner() {
    console.log(text); // μ •μ˜λœ μœ„μΉ˜ κΈ°μ€€ (λ ‰μ‹œμ»¬ μŠ€μ½”ν”„)
  }
  inner();
}
ꡬ뢄 λ ‰μ‹œμ»¬ μŠ€μ½”ν”„ this
κ²°μ • μ‹œμ  μ½”λ“œ μž‘μ„±(μ •μ˜) μœ„μΉ˜ ν•¨μˆ˜ 호좜 방식
νŠΉμ§• 정적(λ³€ν•˜μ§€ μ•ŠμŒ) 동적(호좜 λ§₯락에 따라 달라짐)
μ˜ˆμ‹œ μ™ΈλΆ€ λ³€μˆ˜ μ°Έμ‘° 객체 λ©”μ„œλ“œ 호좜 μ‹œ 객체 μ°Έμ‘°

 

✨ 정리

  • λ ‰μ‹œμ»¬ μŠ€μ½”ν”„: μ½”λ“œκ°€ μž‘μ„±λœ μœ„μΉ˜μ— 따라 λ³€μˆ˜μ˜ 유효 λ²”μœ„κ°€ κ²°μ •λ˜λŠ” 정적 κ·œμΉ™
  • λ ‰μ‹œμ»¬ ν™˜κ²½: 엔진이 이 κ·œμΉ™μ„ μ§€ν‚€κΈ° μœ„ν•΄ λ‚΄λΆ€μ μœΌλ‘œ κ΄€λ¦¬ν•˜λŠ” 객체
  • 엔진은 μŠ€μ½”ν”„ 체인을 따라 λ³€μˆ˜λ₯Ό 검색
  • thisλŠ” 호좜 방식에 따라 κ²°μ •λ˜κ³ , λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λŠ” μ •μ˜λœ μœ„μΉ˜λ‘œ κ²°μ •

 

πŸ“š μ°Έκ³ 

 

λ³€μˆ˜μ˜ μœ νš¨λ²”μœ„μ™€ ν΄λ‘œμ €

 

ko.javascript.info

 

728x90
'πŸ“š ν”„λ‘ νŠΈμ—”λ“œ/Javascript' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [Javascript] AJAX μ•Œμ•„λ³΄κΈ°
  • [JavaScript] μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 비동기 처리 방식
  • [JavaScript] this ν‚€μ›Œλ“œ 정리
  • [JavaScript] var, let, const 차이 정리 (쀑볡 μ„ μ–Έ, ν˜Έμ΄μŠ€νŒ…)
_μ΄μ•Ž
_μ΄μ•Ž
곡뢀 기둝 λΈ”λ‘œκ·Έ
  • _μ΄μ•Ž
    곡뢀
    _μ΄μ•Ž
  • 전체
    였늘
    μ–΄μ œ
    • ✍️ λͺ¨λ“  κΈ€ (51) N
      • πŸ“š ν”„λ‘ νŠΈμ—”λ“œ (36) N
        • React (9) N
        • HTML_CSS (9)
        • Javascript (13)
        • git_github (4)
        • Web (1)
      • πŸ‘€ ν”„λ‘œμ νŠΈ 및 ν™œλ™ (11) N
        • μ½”λ“œμž‡ μŠ€ν”„λ¦°νŠΈ 19κΈ° (11) N
      • βš™οΈ etc. (4)
  • 링크

    • πŸ‘‹ GitHub
    • 🧐 μ½”λ”©ν…ŒμŠ€νŠΈ 기둝
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 인기 κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.4
_μ΄μ•Ž
[JavaScript] λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(Lexical scope) μ•Œμ•„λ³΄κΈ°
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”