Skip to main content

1. Scopeλž€?


πŸ›°οΈ μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λŠ” κ³Όμ •

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λŠ” 과정을 κ°„λž΅ν•˜κ²Œ μ„€λͺ…ν•˜μžλ©΄, 'ν•¨μˆ˜κ°€ 싀행될 λ•Œ 각 μŠ€μ½”ν”„μ— ν•΄λ‹Ήν•˜λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ½œμŠ€νƒμ— μŒ“μΈλ‹€' 라고 ν‘œν˜„ν•  수 μžˆλ‹€.

이 λ¬Έμž₯을 μ΄ν•΄ν•˜κΈ° μœ„ν•΄ μ•Œμ•„μ•Ό ν•  κ°œλ…μ΄ μŠ€μ½”ν”„(Scope)와 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ(Execute Context)인데 μš°μ„  μŠ€μ½”ν”„μ— λŒ€ν•΄ μ •λ¦¬ν•΄λ³΄μž.

πŸŽͺ Scope

μŠ€μ½”ν”„λž€ λ‹¨μ–΄μ˜ 뜻 κ·ΈλŒ€λ‘œ 'λ²”μœ„'λΌλŠ” 의미λ₯Ό κ°€μ§€κ³ μžˆλ‹€. μ½”λ“œμ—μ„œμ˜ μŠ€μ½”ν”„λŠ” 'λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλŠ” λ²”μœ„'라고 보면 λœλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μŠ€μ½”ν”„λŠ” 크게 μ „μ—­ μŠ€μ½”ν”„(Global Scope)와 μ§€μ—­ μŠ€μ½”ν”„(Local Scope)둜 λ‚˜λˆŒ 수 μžˆλ‹€.

μ „μ—­ μŠ€μ½”ν”„(Global Scope): μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œμ˜ μ΅œμƒμœ„ λ ˆλ²¨μ— ν•΄λ‹Ήν•˜λŠ” μŠ€μ½”ν”„λ‘œ ν•¨μˆ˜ μ–΄λ””μ—μ„œλ“  접근이 κ°€λŠ₯ν•˜λ‹€.
μ§€μ—­ μŠ€μ½”ν”„(Local Scope) :νŠΉμ • ν•¨μˆ˜μ— ν•΄λ‹Ήν•˜λŠ” μŠ€μ½”ν”„λ‘œ ν•΄λ‹Ή ν•¨μˆ˜ μžμ‹ κ³Ό ν•˜μœ„ ν•¨μˆ˜μ—μ„œλ§Œ μžμ›μ— 접근이 κ°€λŠ₯ν•˜λ‹€.
블둝 μŠ€μ½”ν”„:
{}둜 묢인 블둝 λ‚΄μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λŠ” ν•΄λ‹Ή 블둝 μ•ˆμ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯ (예: let, const)
λ ‰μ‹œμ»¬ μŠ€μ½”ν”„: λ³€μˆ˜μ˜ λ²”μœ„λŠ” μ½”λ“œ μž‘μ„± μ‹œ(정적) κ²°μ •λ˜λ©°, 호좜 μœ„μΉ˜κ°€ μ•„λ‹Œ μ„ μ–Έ μœ„μΉ˜μ— 따라 μŠ€μ½”ν”„λ₯Ό κ²°μ •

μ—¬κΈ°μ„œ μ½”λ“œμ˜ μ΅œμƒμœ„ 레벨, 즉 μ „μ—­μ—μ„œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ κ·Έ λ³€μˆ˜λŠ” μ „μ—­ λ³€μˆ˜μ΄λ―€λ‘œ global scope에 μ†ν•˜λŠ” 거라고 생각이 λ“€μ§€λ§Œ ν•œκ°€μ§€ μœ μ˜ν•΄μ•Ό ν•  점이 μžˆλ‹€.


1. μ „μ—­μŠ€μ½”ν”„

μ „μ—­ μŠ€μ½”ν”„ = μ§‘ 전체, μ§‘ μ–΄λ””μ—μ„œλ‚˜ 물건을 μ‚¬μš©ν•  수 μžˆλŠ” μƒνƒœ

예) μ§‘ μ•ˆμ— 곡용으둜 λ‘λŠ” μ‹œκ³„κ°€ μžˆλ‹€κ³  κ°€μ •ν•˜μž. κ°€μ‘± λˆ„κ΅¬λ‚˜ λͺ¨λ“  λ°©μ—μ„œ 이 μ‹œκ³„λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

let clock = "Wall Clock"; // μ „μ—­ λ³€μˆ˜

function livingRoom() {
  console.log(clock); // "Wall Clock"
}

function kitchen() {
  console.log(clock); // "Wall Clock"
}

livingRoom();
kitchen();


2. ν•¨μˆ˜ μŠ€μ½”ν”„ (Function Scope)

ν•¨μˆ˜ μŠ€μ½”ν”„ = λ°© μ•ˆμ—λ§Œ λ³΄μ΄λŠ” 물건

λ°©(ν•¨μˆ˜) μ•ˆμ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯ν•˜κ³ , λ‹€λ₯Έ λ°©μ—μ„œλŠ” 보이지 μ•ŠλŠ”λ‹€κ³  μƒκ°ν•˜λ©΄ 됨.

예) 거싀에 μžˆλŠ” μ†ŒνŒŒλŠ” κ±°μ‹€μ—μ„œλ§Œ 보이고 μ‚¬μš©ν•  수 μžˆλ‹€. λ‹€λ₯Έ λ°©μ—μ„œλŠ” 보이지 μ•ŠμŒ.

function livingRoom() {
  let sofa = "Sofa";
  console.log(sofa); // "Sofa"
}

livingRoom();
console.log(sofa); // Error: sofa is not defined


3. 블둝 μŠ€μ½”ν”„ (Block Scope)

블둝 μŠ€μ½”ν”„ = μ„œλž μ•ˆμ— λ„£μ–΄λ‘” 물건

μ„œλž(블둝 {}) μ•ˆμ—μ„œλ§Œ 보이고, λ°–μ—μ„œλŠ” λ³Ό 수 μ—†λ‹€.

예) κ±°μ‹€μ˜ μ„œλžμ— 숨겨 λ‘” 리λͺ¨μ»¨μ€ μ„œλžμ„ μ—΄μ—ˆμ„ λ•Œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.

if (true) {
  let remote = "Remote Control";
  console.log(remote); // "Remote Control"
}

console.log(remote); // Error: remote is not defined


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

λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λŠ” λ°©μ—μ„œ 찾을 수 μ—†μœΌλ©΄ μ§‘ 전체λ₯Ό λ’€μ§€λŠ” 것과 κ°™λ‹€.

μ•ˆμͺ½μ—μ„œ μ„ μ–Έλ˜μ§€ μ•Šμ€ λ³€μˆ˜λ₯Ό 찾으면, λ°”κΉ₯(μƒμœ„ μŠ€μ½”ν”„)μ—μ„œμ°ΎλŠ”λ‹€.

예) κ±°μ‹€μ—μ„œ 물건을 λͺ» 찾으면 μ£Όλ°©, ν˜„κ΄€ λ“± μ§‘ 전체λ₯Ό μ°Ύμ•„λ³Έλ‹€.

let light = "Ceiling Light";

function livingRoom() {
  console.log(light); // "Ceiling Light"
}

livingRoom();


5. 쀑첩 μŠ€μ½”ν”„

λ°© μ•ˆμ— μ„œλžμ΄ μžˆλŠ” 경우, μ„œλž 속 물건은 λ°© μ•ˆμ—μ„œλŠ” λ³΄μ΄μ§€λ§Œ, μ§‘ μ „μ²΄μ—μ„œλŠ” 보이지 μ•ŠλŠ”λ‹€.

예) λ°© μ•ˆμ— μžˆλŠ” λ…ΈνŠΈμ™€ μ„œλž 속 펜.

function livingRoom() {
  let note = "Notebook";
  
  if (true) {
    let pen = "Pen";
    console.log(note); // "Notebook" (μƒμœ„ μŠ€μ½”ν”„μ—μ„œ κ°€μ Έμ˜΄)
    console.log(pen); // "Pen"
  }

  console.log(pen); // Error: pen is not defined
}

livingRoom();


μ „μ—­ μŠ€μ½”ν”„: μ§‘ μ „μ²΄μ—μ„œ μ‚¬μš© κ°€λŠ₯.
ν•¨μˆ˜ μŠ€μ½”ν”„: νŠΉμ • λ°©μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯.
블둝 μŠ€μ½”ν”„: νŠΉμ • μ„œλžμ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯.
λ ‰μ‹œμ»¬ μŠ€μ½”ν”„: μ•ˆμͺ½μ—μ„œ λͺ» 찾으면 λ°”κΉ₯으둜 λ‚˜κ°€λ©° 찾음.