Hello Kitty Eyes Shut
λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ’»κ³΅λΆ€ 기둝/πŸ“Œ λ¦¬μ•‘νŠΈ 기초 μŠ€ν„°λ””

[λ¦¬μ•‘νŠΈ 기초 μŠ€ν„°λ””] JavaScript μŠ€μ½”ν”„ 체인 (Scope Chain)

λ°˜μ‘ν˜•

 

 

 

 

 

 

πŸ“‘ JavaScript μŠ€μ½”ν”„ 체인 (Scope Chain)

μ•žμ„  ν¬μŠ€νŒ…μ—μ„œ μ‚΄νŽ΄λ΄€λ“―μ΄, λ³€μˆ˜μ—λŠ” μ „μ—­ μŠ€μ½”ν”„, μ§€μ—­ μŠ€μ½”ν”„, 블둝 μŠ€μ½”ν”„κ°€ μžˆμ—ˆλ‹€.

 

(μ•„λž˜ ν¬μŠ€νŒ… μ°Έκ³ )

 

[λ¦¬μ•‘νŠΈ 기초 μŠ€ν„°λ””] JavaScript μŠ€μ½”ν”„(scope)

λͺ©μ°¨ (OPEN)πŸ“‘ JavaScript μŠ€μ½”ν”„ (scope)πŸŸ₯ μ „μ—­ μŠ€μ½”ν”„ (Golbal Scope)🟧 μ§€μ—­ μŠ€μ½”ν”„ (Local Scope)🟨 블둝 μŠ€μ½”ν”„ (Block Scope)🟩 ν•¨μˆ˜ μ•ˆμ˜ ν•¨μˆ˜ (쀑첩 ν•¨μˆ˜ μŠ€μ½”ν”„)πŸ“š κ²°λ‘  πŸ“‘ JavaScript μŠ€μ½”ν”„ (scope)μ½”λ”©

sso-codingdiary.tistory.com

 

κ·Έλ ‡λ‹€λ©΄ ν•¨μˆ˜ μ•ˆμ—μ„œ λ³€μˆ˜λ₯Ό 찾을 λ•Œ

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ–΄λ–»κ²Œ λ³€μˆ˜λ₯Ό νƒμƒ‰ν•˜λŠ” κ²ƒμΌκΉŒ?

 

이 과정을 μŠ€μ½”ν”„ 체인 (scope chain)이라고 λΆ€λ₯Έλ°,

μ˜€λŠ˜μ€ 이 μŠ€μ½”ν”„ 체인에 λŒ€ν•΄μ„œ μžμ„Ένžˆ μ•Œμ•„λ³΄κ³ μž ν•œλ‹€.

 

 


πŸŸ₯ μŠ€μ½”ν”„ 체인의 κΈ°λ³Έ 원리

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ³€μˆ˜λ₯Ό 찾을 λ•Œ μ•„λž˜μ˜ μˆœμ„œλ‘œ 탐색을 ν•œλ‹€.

  1. μžμ‹ μ˜ μŠ€μ½”ν”„ (ν˜„μž¬ 블둝 λ˜λŠ” ν˜„μž¬ ν•¨μˆ˜) μ•ˆμ—μ„œ μ°ΎκΈ°
  2. 1λ²ˆμ—μ„œ μ—†μ—ˆλ‹€λ©΄ ν•œ 단계 λ°”κΉ₯ μŠ€μ½”ν”„λ‘œ λ‚˜κ°€μ„œ μ°ΎκΈ°
  3. κ·Έλž˜λ„ μ—†λ‹€λ©΄ 또 ν•œ 단계 λ°”κΉ₯ μŠ€μ½”ν”„λ‘œ λ‚˜κ°€μ„œ μ°ΎκΈ°
  4. 이 과정을 λ°˜λ³΅ν•˜λ‹€κ°€ λκΉŒμ§€ λ‚˜κ°”λŠ”λ°λ„ μ—†λ‹€λ©΄ ReferenceError λ°œμƒ

 

이처럼 λ³€μˆ˜λŠ” μ•ˆμͺ½μ—μ„œ λ°”κΉ₯μͺ½ λ°©ν–₯으둜 λ‚˜κ°€λ©΄μ„œλ§Œ 찾을 수 있고,

거꾸둜 λ°”κΉ₯μ—μ„œ μ•ˆμͺ½μœΌλ‘œ λ“€μ–΄μ˜€λ©΄μ„œ μ°ΎλŠ” 것은 λΆˆκ°€λŠ₯ν•˜λ‹€.

 

 


🟧 예제둜 μ‚΄νŽ΄λ³΄κΈ°

1) ν•¨μˆ˜ μ•ˆμ—μ„œ μ „μ—­ λ³€μˆ˜ μ°Έμ‘°ν•˜κΈ°

let x = 10;

function printX() {
  console.log(x);
}

printX(); // 10

 

printX ν•¨μˆ˜ μ•ˆμ—λŠ” xλΌλŠ” λ³€μˆ˜κ°€ μ—†μœΌλ‹ˆκΉŒ

ν•œ 단계 λ°”κΉ₯ μŠ€μ½”ν”„λ‘œ λ‚˜κ°€μ„œ (= μ „μ—­ μŠ€μ½”ν”„) μ „μ—­ λ³€μˆ˜ xλ₯Ό λ°œκ²¬ν•˜κ²Œ λœλ‹€.

λ”°λΌμ„œ 좜λ ₯은 μ „μ—­ λ³€μˆ˜ x의 값인 10이 λ˜λŠ” 것이닀.

 

 

2) 같은 μ΄λ¦„μ˜ μ§€μ—­λ³€μˆ˜μ™€ μ „μ—­λ³€μˆ˜κ°€ μžˆλŠ” 경우 (shadowing)

let x = 10;

function printX() {
  let x = 20;
  console.log(x);
}

printX(); // 20
console.log(x); // 10

 

λ¨Όμ € printX ν•¨μˆ˜κ°€ ν˜ΈμΆœλΌμ„œ xλΌλŠ” λ³€μˆ˜λ₯Ό 좜λ ₯ν•˜κΈ° μœ„ν•΄ λ¨Όμ € ν•¨μˆ˜ μ•ˆμ—μ„œ μ°Ύλ‹€ λ³΄λ‹ˆκΉŒ

μ§€μ—­ λ³€μˆ˜ x = 20μ΄λΌλŠ” 값이 μžˆμŒμ„ λ°œκ²¬ν•˜κ²Œ 되고,

λ”°λΌμ„œ ν•¨μˆ˜ 호좜의 결과둜 20μ΄λΌλŠ” 값이 μ½˜μ†”μ— 좜λ ₯λœλ‹€.

(μ΄λ•Œ, λ°”κΉ₯에 μžˆλŠ” μ „μ—­ λ³€μˆ˜μΈ x=10 은 μ§€μ—­λ³€μˆ˜μ— κ°€λ €μ Έμ„œ(shadowing) ν•¨μˆ˜ μ•ˆμ—μ„œ 접근이 λΆˆκ°€λŠ₯ν•˜κ²Œ λœλ‹€.)

 

κ·ΈλŸ¬λ‚˜ 밑에 μžˆλŠ” console.log(x)μ—μ„œλŠ” λ°˜λŒ€λ‘œ ν•¨μˆ˜ μ•ˆμ— μžˆλŠ” μ§€μ—­ λ³€μˆ˜μΈ x=10에 μ ‘κ·Όν•  μˆ˜κ°€ μ—†μœΌλ‹ˆκΉŒ

제일 λ¨Όμ € λ°œκ²¬ν•˜κ²Œ λ˜λŠ” x=10μ΄λΌλŠ” μ „μ—­λ³€μˆ˜μ˜ 값을 좜λ ₯ν•˜κ²Œ λ˜λŠ” 것이닀.

 

 

3) ν•¨μˆ˜ μ•ˆμ˜ ν•¨μˆ˜ (쀑첩 μŠ€μ½”ν”„ 체인)

let a = 1;

function outer() {
  let b = 2;
  
  function inner() {
    let c = 3;
    console.log(a, b, c);
  }
  
  inner();
}

outer(); // 1 2 3

 

이 μ˜ˆμ‹œμ˜ 경우 탐색 과정은 μ•„λž˜μ™€ 같이 μ§„ν–‰λœλ‹€.

  1. inner ν•¨μˆ˜ μ•ˆμ—μ„œ cλΌλŠ” λ³€μˆ˜λ₯Ό λ°œκ²¬ν•œλ‹€.
  2. λ³€μˆ˜ bλŠ” inner ν•¨μˆ˜ μ•ˆμ—μ„œ λ°œκ²¬λ˜μ§€ μ•ŠμœΌλ‹ˆ,
    ν•œ 단계 λ°”κΉ₯ μŠ€μ½”ν”„μΈ outer ν•¨μˆ˜λ‘œ λ‚˜κ°€μ„œ λ‹€μ‹œ νƒμƒ‰ν•˜λ‹€κ°€ λ°œκ²¬ν•œλ‹€.
  3. λ³€μˆ˜ aλŠ” innerμ—μ„œ 발견이 μ•ˆ λΌμ„œ
    ν•œ 단계 λ°”κΉ₯ μŠ€μ½”ν”„μΈ outerμ—μ„œ 탐색을 ν•΄λ³΄μ•˜μ§€λ§Œ, μ—¬μ „νžˆ λ°œκ²¬λ˜μ§€ μ•ŠμœΌλ‹ˆ
    ν•œ 단계 더 λ°”κΉ₯ μŠ€μ½”ν”„μΈ μ „μ—­ μŠ€μ½”ν”„κΉŒμ§€ λ‚˜κ°€κ²Œ 되고, μ—¬κΈ°μ—μ„œ λ°œκ²¬ν•˜κ²Œ λœλ‹€.

 

 

4) λ°”κΉ₯μ—μ„œ μ•ˆμͺ½ λ³€μˆ˜λ₯Ό μ ‘κ·Όν•˜λ €κ³  ν•˜λŠ” 경우

function outer() {
  let secret = "λΉ„λ°€";
  
  function inner() {
    console.log(secret); // λΉ„λ°€
  }
  
  inner();
}

outer();
console.log(secret); // ❌ ReferenceError

 

이처럼 μœ„μ˜ 예제 μ½”λ“œλ₯Ό 싀행해보면,

outer ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν–ˆμ„ λ•Œμ—λŠ” κ·Έ μ•ˆμ—μ„œ inner ν•¨μˆ˜κ°€ 호좜되고,
console.log(secret); λΆ€λΆ„μ—μ„œ secret λ³€μˆ˜λ₯Ό μ½˜μ†”μ— 좜λ ₯ν•˜λ €κ³  ν•œλ‹€.

 

μ΄λ•Œ, inner ν•¨μˆ˜ 자기 μžμ‹  μ•ˆμ—μ„œλŠ” secretμ΄λΌλŠ” λ³€μˆ˜κ°€ λ°œκ²¬λ˜μ§€ μ•ŠμœΌλ‹ˆκΉŒ

ν•œ 단계 λ°”κΉ₯으둜 λ‚˜κ°€μ„œ outer ν•¨μˆ˜λ₯Ό νƒμƒ‰ν•˜κ²Œ 되고,

μ—¬κΈ°μ—μ„œ secret λ³€μˆ˜λ₯Ό λ°œκ²¬ν•΄μ„œ "λΉ„λ°€"μ΄λΌλŠ” 값을 μ½˜μ†”μ— 좜λ ₯ν•΄μ€€λ‹€.

 

κ·ΈλŸ¬λ‚˜ κ°€μž₯ ν•˜λ‹¨μ— μžˆλŠ” console.log(secret);λ₯Ό μ‹€ν–‰ν•˜λ €κ³  λ³΄λ‹ˆκΉŒ

자기 μžμ‹ μ˜ μŠ€μ½”ν”„μΈ μ „μ—­ μŠ€μ½”ν”„μ—μ„œ secret λ³€μˆ˜λ₯Ό μ°Ύμ•„λ³΄μ•˜μœΌλ‚˜ 발견이 λ˜μ§€ μ•Šμ•„μ„œ

더이상 λ°”κΉ₯으둜 λ‚˜κ°ˆ 곳이 μ—†μœΌλ‹ˆ 탐색을 λ©ˆμΆ”κ³  ReferenceErrorλ₯Ό λ„μš°κ²Œ λœλ‹€.

 

 


πŸ“š κ²°λ‘ 

μŠ€μ½”ν”„ μ²΄μΈκΉŒμ§€ ν¬μŠ€νŒ…μœΌλ‘œ μ •λ¦¬ν•΄λ‘λ‹ˆ μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ λ³€μˆ˜λ₯Ό μ–΄λ–»κ²Œ μ°ΎλŠ”μ§€κ°€ 머릿속에 잘 κ·Έλ €μ§€λŠ” 것 κ°™λ‹€.

 

μ΄λ²ˆμ—λ„ μ—­μ‹œ μ•žμœΌλ‘œ μ½”λ“œλ₯Ό μ§€ λ•Œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  μœ„μΉ˜λ₯Ό 신쀑이 μ •ν•΄μ•Ό ν•˜κ³ ,

괜히 μ „μ—­ λ³€μˆ˜λ₯Ό λ‚¨λ°œν•˜λ©΄ μ–΄λ””μ—μ„œ 값이 λ°”λ€Œμ—ˆλŠ”μ§€ μΆ”μ ν•˜κΈ° νž˜λ“€λ‹€λŠ” 것을 λ‹€μ‹œ 느끼게 λ˜μ—ˆλ‹€.

λ°˜μ‘ν˜•