Skip to content

Latest commit

Β 

History

History
39 lines (29 loc) Β· 1.96 KB

Closure.md

File metadata and controls

39 lines (29 loc) Β· 1.96 KB

ν΄λ‘œμ €

ν΄λ‘œμ €(Closure)λŠ” ν•¨μˆ˜κ°€ λ™μ μœΌλ‘œ μƒμ„±λœ λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλŠ” 방법을 μ œκ³΅ν•©λ‹ˆλ‹€. ν΄λ‘œμ €λŠ” ν•¨μˆ˜ 내뢀에 μ„ μ–Έλœ λ³€μˆ˜λ₯Ό ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œλ„ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•΄μ€λ‹ˆλ‹€.

ν΄λ‘œμ €λŠ” λ‚΄λΆ€ ν•¨μˆ˜κ°€ μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  λ•Œ λ°œμƒν•©λ‹ˆλ‹€. μ΄λ•Œ λ‚΄λΆ€ ν•¨μˆ˜κ°€ μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 더 였래 μœ μ§€λ  경우, λ‚΄λΆ€ ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό 계속 μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό 계속 μ°Έμ‘°ν•  수 μžˆλŠ” ν•¨μˆ˜λ₯Ό ν΄λ‘œμ €λΌκ³  ν•©λ‹ˆλ‹€.


const x = 1;

// (1)
function outer() {
  const x = 10;
  const inner = function() { console.log(x);} // (2)
  return inner;
}

// outer ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ 쀑첩 ν•¨μˆ˜ innerλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
// 그리고 outer ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ νŒλ˜μ–΄ μ œκ±°λ©λ‹ˆλ‹€.
const innerFunc = outer(); // (3)
innerFunc() // (4) 10

  1. outer ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ outer ν•¨μˆ˜λŠ” 쀑첩 ν•¨μˆ˜ innerλ₯Ό λ°˜ν™˜ν•˜κ³  생λͺ… μ£ΌκΈ°λ₯Ό λ§ˆκ°ν•©λ‹ˆλ‹€. 즉, outer ν•¨μˆ˜μ˜ 싀행이 μ’…λ£Œλ˜λ©΄ outer ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ μ œκ±°λ©λ‹ˆλ‹€.

  2. outer ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜ x와 λ³€μˆ˜ κ°’ 10을 μ €μž₯ν•˜κ³  있던 outer ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μ œκ±°λ˜μ—ˆμœΌλ―€λ‘œ outer ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜ x λ˜ν•œ 생λͺ…μ£ΌκΈ°λ₯Ό λ§ˆκ°ν•©λ‹ˆλ‹€. λ”°λΌμ„œ outer ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜ xλŠ” λ”λŠ” μœ νš¨ν•˜μ§€ μ•Šκ²Œ λ˜μ–΄ x λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλŠ” 방법은 달리 μ—†μ–΄ λ³΄μž…λ‹ˆλ‹€.

  3. ν•˜μ§€λ§Œ μœ„ μ½”λ“œμ˜ μ‹€ν–‰κ²°κ³Ό (4) λŠ” outer ν•¨μˆ˜μ˜ 지역 λ³€μˆ˜ x의 값인 10μž…λ‹ˆλ‹€.

  4. 이처럼 μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 쀑첩 ν•¨μˆ˜κ°€ 더 였래 μœ μ§€λ˜λŠ” 경우 쀑첩 ν•¨μˆ˜λŠ” 이미 생λͺ… μ£ΌκΈ°κ°€ μ’…λ£Œν•œ μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 쀑첩 ν•¨μˆ˜λ₯Ό ν΄λ‘œμ €(closure)라고 λΆ€λ¦…λ‹ˆλ‹€.


μ°Έκ³  λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive ~393p