λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ“‹Technical interview(Front)

[JavaScript] Scopeλž€?

by λ…Ήμ°¨λ§›κ°œκ΅¬λ¦¬ 2022. 11. 5.
 πŸ‘‍πŸ—¨μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„(function-level scope)λ₯Ό λ”°λ₯Έλ‹€.
ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„λž€ ν•¨μˆ˜ μ½”λ“œ 블둝 λ‚΄μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λŠ” ν•¨μˆ˜ μ½”λ“œ 블둝 λ‚΄μ—μ„œλ§Œ μœ νš¨ν•˜κ³  ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œλŠ” μœ νš¨ν•˜μ§€ μ•Šλ‹€(μ°Έμ‘°ν•  수 μ—†λ‹€)λŠ” 것이닀.

πŸ‘‰πŸ»λ‹¨, ECMAScript 6μ—μ„œ λ„μž…λœ let keywordλ₯Ό μ‚¬μš©ν•˜λ©΄ 블둝 레벨 μŠ€μ½”ν”„λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

πŸ‘¨πŸ»‍πŸ’» Scopeλž€?

ScopeλŠ” μ§μ—­ν•˜λ©΄ "λ²”μœ„"λΌλŠ” λœ»μ΄λ‹€.
JavaScript μ—μ„œ Scope(μŠ€μ½”ν”„)λŠ” λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλŠ” λ²”μœ„λ₯Ό λ§ν•œλ‹€.
μ‹λ³„μž(λ³€μˆ˜)λ₯Ό μ°ΎκΈ°μœ„ν•œ κ·œμΉ™μ΄λΌκ³ λ„ ν•œλ‹€.

 

μ‹λ³„μžμ˜ 유효 λ²”μœ„ ⇒ λͺ¨λ“  μ‹λ³„μžλŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜μ— μ˜ν•˜μ—¬ λ‹€λ₯Έ μ½”λ“œκ°€ μ‹λ³„μž μžμ‹ μ„ μ°Έμ‘°ν•  수 μžˆλŠ”

유효 λ²”μœ„κ°€ 결정됨.

var x = 'global';

function exampleFunction() {
	// ν•¨μˆ˜ 내에 μ„ μ–Έλœ x λ³€μˆ˜λŠ” ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ μ°Έμ‘°κ°€λŠ₯
    var x = "declared inside function";
    console.log(x);
}

exampleFunction(); // "declared inside function"
console.log(x);  // 'global'

μœ„ μ˜ˆμ œμ—μ„œ xκ°€ λ‘λ²ˆ μ„ μ–Έλ˜μ—ˆλŠ”λ°, JavaScriptλŠ” 각 xκ°€ μ–΄λ–€ 값을 κ°€μ§€λŠ”μ§€ μ–΄λ–»κ²Œ ꡬ별할 수 μžˆμ„κΉŒ?

 

μœ„ μ˜ˆμ œμ—μ„œ 전역에 μ„ μ–Έλœ λ³€μˆ˜ xλŠ” ν•¨μˆ˜ μ•ˆμ—μ„œλ“  λ°–μ—μ„œλ“ μ§€ 어디에든 μ°Έμ‘°ν•  수 μžˆλ‹€.

ν•˜μ§€λ§Œ ν•¨μˆ˜ exampleFunction λ‚΄μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜ xλŠ” ν•¨μˆ˜ exampleFunction λ‚΄λΆ€μ—μ„œλ§Œ μ°Έμ‘°ν•  수 있고,

μ™ΈλΆ€μ—μ„œλŠ” μ°Έμ‘°ν•  수 μ—†λ‹€.

 

πŸ’«key point

πŸ”” “μ‹λ³„μž μ ‘κ·Ό κ·œμΉ™μ— λ”°λ₯Έ 유효 λ²”μœ„”λ₯Ό μŠ€μ½”ν”„μ˜ μ •μ˜λΌκ³  ν•œλ‹€.

 

ν•œ μŠ€μ½”ν”„ λ‚΄μ—μ„œλŠ” μ‹λ³„μžκ°€ μœ μΌν•΄μ•Ό ν•˜μ§€λ§Œ, λ‹€λ₯Έ μŠ€μ½”ν”„μ—λŠ” 동λͺ…μ˜ μ‹λ³„μžλ₯Ό μ‚¬μš©ν•  수 있음.
( μœ„ μ˜ˆμ œμ—μ„œ λ³€μˆ˜λͺ…이 같은 xλ₯Ό λ‘κ°œ μ„ μ–Έ ν•  수 μžˆμ—ˆλ˜ 이유.)
⇒ λ„€μž„μŠ€νŽ˜μ΄μŠ€
μ‹λ³„μž κ²°μ •(identifier resolution) : μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μŠ€μ½”ν”„λ₯Ό ν†΅ν•΄μ„œ μ–΄λ–€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  것인지 결정함.

 


μŠ€μ½”ν”„μ˜ νŠΉμ§•

πŸ‘‰ κ·œμΉ™1. μ•ˆμͺ½ μŠ€μ½”ν”„μ—μ„œ λ°”κΉ₯μͺ½ μŠ€μ½”ν”„λ‘œ μ ‘κ·Όν•  수 μžˆμ§€λ§Œ λ°˜λŒ€λŠ” λΆˆκ°€λŠ₯ν•˜λ‹€.

  • λ°”κΉ₯μͺ½ μŠ€μ½”ν”„μ—μ„œ μ„ μ–Έν•œ μ‹λ³„μžλŠ” μ•ˆμͺ½ μŠ€μ½”ν”„μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.
  • 반면, μ•ˆμͺ½μ—μ„œ μ„ μ–Έν•œ μ‹λ³„μžλŠ” λ°”κΉ₯μͺ½ μŠ€μ½”ν”„μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†λ‹€.

πŸ‘‰ κ·œμΉ™2. μŠ€μ½”ν”„λŠ” 쀑첩이 κ°€λŠ₯ν•˜λ‹€.

  • μŠ€μ½”ν”„λŠ” 마치 μ€‘μ²©λœ μšΈνƒ€λ¦¬μ™€λ„ κ°™λ‹€.

πŸ‘‰ κ·œμΉ™3. μ „μ—­ μŠ€μ½”ν”„μ™€ μ§€μ—­ μŠ€μ½”ν”„

  • κ°€μž₯ λ°”κΉ₯μͺ½μ˜ μŠ€μ½”ν”„λ₯Ό μ „μ—­ μŠ€μ½”ν”„(Global Scope)라고 λΆ€λ₯Έλ‹€.
  • 전역이 μ•„λ‹Œ λ‹€λ₯Έ μŠ€μ½”ν”„λŠ” μ „λΆ€ μ§€μ—­ μŠ€μ½”ν”„(Local Scope)이닀.

πŸ‘‰ κ·œμΉ™4. μ§€μ—­ λ³€μˆ˜λŠ” μ „μ—­ λ³€μˆ˜λ³΄λ‹€ μš°μ„ μˆœμœ„κ°€ 더 λ†’λ‹€.

  • μ „μ—­ μŠ€μ½”ν”„μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ „μ—­ λ³€μˆ˜μ΄λ‹€.
  • μ§€μ—­ μŠ€μ½”ν”„μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ§€μ—­ λ³€μˆ˜μ΄λ‹€.
  • μ§€μ—­ λ³€μˆ˜λŠ” μ „μ—­ λ³€μˆ˜λ³΄λ‹€ 더 높은 μš°μ„ μˆœμœ„λ₯Ό κ°€μ§„λ‹€.

ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„ VS 블둝 레벨 μŠ€μ½”ν”„

μ§€μ—­ μŠ€μ½”ν”„λŠ” ν•¨μˆ˜μ— μ˜ν•΄μ„œ μƒμ„±λ˜λŠ”κ°€, μ½”λ“œ 블둝에 μ˜ν•΄μ„œ μƒμ„±λ˜λŠ”κ°€μ— 따라 레벨이 λ‚˜λ‰¨.

πŸ“‹ 블둝 레벨 μŠ€μ½”ν”„ : if, for, while, try/catch, { } λ“± μ½”λ“œ 블둝이 μ§€μ—­ μŠ€μ½”ν”„ 생성

 let, const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” λͺ¨λ“  μ½”λ“œ 블둝을 μ§€μ—­ μŠ€μ½”ν”„λ‘œ 인정함.

μ£Όμ˜ν•΄μ•Όν•  점은 ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” 블둝 μŠ€μ½”ν”„λ‘œ μ·¨κΈ‰λœλ‹€.

{
  var a = "A inner"
  let b = "B inner"
  const c = "C inner"
}

console.log(a)
console.log(b)  //ReferenceError: b is not defined
// console.log(c) ReferenceError: c is not defined
πŸ‘‰πŸ»var둜 μ„ μ–Έλœ λ³€μˆ˜λŠ” μ„ μ–Έλœ ν•¨μˆ˜λ‚΄μ—μ„œλ§Œ μ§€μ—­μŠ€μ½”ν”„λ‘œ μΈμ •ν•˜κΈ° λ•Œλ¬Έμ— λΈ”λ‘μŠ€μ½”ν”„μ•ˆμ— μžˆμ„λ•Œ
μ™ΈλΆ€μ—μ„œ 호좜 μ‹œ μ°Έμ‘°ν•  수 μžˆμ§€λ§Œ,

πŸ‘‰πŸ»let, constλŠ” λΈ”λ‘λ ˆλ²¨ μŠ€μ½”ν”„λ‘œ if, for, while, try/catch λ“± μ½”λ“œ 블둝{ } μ•ˆμ— μžˆμ„λ•Œ μ§€μ—­μŠ€μ½”ν”„λ‘œ 인정을 ν•˜κΈ°μ—
μ™ΈλΆ€ 호좜 μ‹œ μ—λŸ¬κ°€ λœ¨λŠ” λͺ¨μŠ΅.

 

πŸ“‹ ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„ : ν•¨μˆ˜κ°€ μ§€μ—­ μŠ€μ½”ν”„ 생성 ⇒ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ”

였직 'ν•¨μˆ˜'λ§Œμ„ μ§€μ—­ μŠ€μ½”ν”„λ‘œ 인정함.

{
  // ν•¨μˆ˜κ°€ μ•„λ‹Œ if, for, while, try/catch λ“± 
  // μ½”λ“œ λΈ”λ‘μ•ˆμ—μ„œ μ§€μ—­μŠ€μ½”ν”„ 인정x
  var x = "inner";
}

// {}μŠ€μ½”ν”„ λ°–μ—μ„œ xλ₯Ό μ½˜μ†”λ‘œ ν˜ΈμΆœν–ˆμ§€λ§Œ ν•¨μˆ˜λΈ”λ‘μ΄μ•„λ‹Œ μ½”λ“œλΈ”λ‘μ΄λΌ
console.log(x);   // inner 좜λ ₯됨
function example() {
  var x = "inner";
} 

// ν•¨μˆ˜ μŠ€μ½”ν”„μ— 따라 ν•¨μˆ˜λ°–μ—μ„œ ν•¨μˆ˜μ•ˆ λ³€μˆ˜μ— μ ‘κ·Ό λΆˆκ°€ μ—λŸ¬
console.log(x);  // ReferenceError: x is not defined

 

 

πŸ“š μ°Έκ³ 


https://developer.mozilla.org/ko/docs/Glossary/Scope

https://poiemaweb.com/js-scope

JS | 잘 봐, μžλ°”μŠ€ν¬λ¦½νŠΈ μŠ€μ½”ν”„(Scope) 싸움이닀 πŸ”₯

728x90