ν•¨μˆ˜μ™€ ν•¨μˆ˜κ°€ μ„ μ–Έλœ μ–΄νœ˜μ  ν™˜κ²½μ˜ 쑰합이닀.


μ–΄νœ˜μ  λ²”μœ„ 지정(Lexical scoping)

function init() {
  const name = 'Sanny'; // name은 init에 μ˜ν•΄ μƒμ„±λœ 지역 λ³€μˆ˜μ΄λ‹€.

  function displayName() { // displayName() 은 λ‚΄λΆ€ ν•¨μˆ˜μ΄λ©°, ν΄λ‘œμ €λ‹€.
    alert(name); // λΆ€λͺ¨ ν•¨μˆ˜μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.
  }

  displayName();
}

init();
  • μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ displayName()Β ν•¨μˆ˜ λ‚΄μ˜Β alert()문이 λΆ€λͺ¨ ν•¨μˆ˜μ—μ„œ μ •μ˜ν•œ λ³€μˆ˜Β name의 값을 μ„±κ³΅μ μœΌλ‘œ 좜λ ₯ν•œλ‹€.
  • 이 μ˜ˆμ‹œλ₯Ό 톡해 ν•¨μˆ˜κ°€ μ€‘μ²©λœ μƒν™©μ—μ„œ νŒŒμ„œκ°€ μ–΄λ–»κ²Œ λ³€μˆ˜λ₯Ό μ²˜λ¦¬ν•˜λŠ”μ§€ μ•Œ 수 μžˆλ‹€.
  • μ΄λŠ” μ–΄νœ˜μ  λ²”μœ„ 지정(Lexical Scoping)의 ν•œ μ˜ˆμ΄λ‹€. μ—¬κΈ°μ„œ Lexicalμ΄λž€, μ–΄νœ˜μ  λ²”μœ„ 지정(Lexical Scoping) κ³Όμ •μ—μ„œ λ³€μˆ˜κ°€ μ–΄λ””μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•œμ§€ μ•ŒκΈ° μœ„ν•΄ κ·Έ λ³€μˆ˜κ°€ μ†ŒμŠ€μ½”λ“œ λ‚΄ μ–΄λ””μ—μ„œ μ„ μ–Έλ˜μ—ˆλŠ”μ§€ κ³ λ €ν•œλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.
  • 단어 Lexical은 이런 사싀을 λ‚˜νƒ€λ‚Έλ‹€. μ€‘μ²©λœ ν•¨μˆ˜λŠ” μ™ΈλΆ€ λ²”μœ„(scope)μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜μ—λ„ μ ‘κ·Όν•  수 μžˆλ‹€.

ν΄λ‘œμ €(Closure)

  • μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜κ³ , λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜κ°€ ν΄λ‘œμ €λ₯Ό ν˜•μ„±ν•œλ‹€.
  • ν΄λ‘œμ €λŠ” ν•¨μˆ˜μ™€ ν•¨μˆ˜κ°€ μ„ μ–Έλœ μ–΄νœ˜μ  ν™˜κ²½μ˜ 쑰합이닀. 이 ν™˜κ²½μ€ ν΄λ‘œμ €κ°€ μƒμ„±λœ μ‹œμ μ˜ 유효 λ²”μœ„ 내에 μžˆλŠ” λͺ¨λ“  지역 λ³€μˆ˜λ‘œ κ΅¬μ„±λœλ‹€.
  • ν΄λ‘œμ €(Closure)λŠ” λ‚΄λΆ€ν•¨μˆ˜κ°€ μ™ΈλΆ€ν•¨μˆ˜μ˜ λ§₯락(context)에 μ ‘κ·Όν•  수 μžˆλŠ” 것을 λ§ν•œλ‹€.