πŸ“’ ν΄λ‘œμ €(closure)

zooyahoΒ·2022λ…„ 8μ›” 5일
0
post-thumbnail

🧠 λ˜μƒˆκΉ€

πŸ“Ž μŠ€μ½”ν”„ 체인

: μŠ€μ½”ν”„μ˜ μ‹€μ²΄λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ˜ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄λ‹€. 이 λ ‰μ‹œμ»¬ ν™˜κ²½μ€ μžμ‹ μ˜ 'μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°'λ₯Ό 톡해 μƒμœ„ λ ‰μ‹œμ»¬ ν™˜κ²½κ³Ό μ—°κ²°λœλ‹€. 이것이 μŠ€μ½”ν”„ 체인이닀.

πŸ“Ž λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(정적 μŠ€μ½”ν”„)

: μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•¨μˆ˜λ₯Ό 어디에 μ •μ˜ν–ˆλŠ”μ§€μ— 따라 μƒμœ„μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€.
: λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ 'μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— λŒ€ν•œ μ°Έμ‘°'에 μ €μž₯ν•  μ°Έμ‘°κ°’, 즉 μƒμœ„ μŠ€μ½”ν”„μ— λŒ€ν•œ μ°Έμ‘°λŠ” ν•¨μˆ˜ μ •μ˜κ°€ ν‰κ°€λ˜λŠ” μ‹œμ μ— ν•¨μˆ˜κ°€ μ •μ˜λœ ν™˜κ²½(μœ„μΉ˜)에 μ˜ν•΄ κ²°μ •λœλ‹€.

πŸ“Ž ν•¨μˆ˜ 객체의 λ‚΄λΆ€ 슬둯 [[Environment]]

: ν•¨μˆ˜λŠ” μžμ‹ μ˜ λ‚΄λΆ€ 슬둯 [[Environment]]에 μžμ‹ μ˜ μ •μ˜λœ ν™˜κ²½, 즉 μƒμœ„ μŠ€μ½”ν”„μ˜ μ°Έμ‘°λ₯Ό μ €μž₯ν•œλ‹€.

πŸ”₯ ν΄λ‘œμ €(closure)

  • μ™ΈλΆ€ ν•¨μˆ˜λ³΄λ‹€ 쀑첩 ν•¨μˆ˜κ°€ 더 였래 μœ μ§€λ˜λŠ” 경우 쀑첩 ν•¨μˆ˜λŠ” 이미 생λͺ…μ£ΌκΈ°κ°€ μ’…λ£Œν•œ μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” μ€‘μ²©ν•¨μˆ˜λ₯Ό ν΄λ‘œμ €λΌκ³  ν•œλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  ν•¨μˆ˜λŠ” μžμ‹ μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κΈ°μ–΅ν•œλ‹€.
  • λͺ¨λ“œ ν•¨μˆ˜κ°€ κΈ°μ–΅ν•˜λŠ” μƒμœ„ μŠ€μ½”ν”„λŠ” ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν•˜λ“  상관없이 μœ μ§€λœλ‹€. λ”°λΌμ„œ ν•¨μˆ˜λŠ” μ–Έμ œλ‚˜ μžμ‹ μ΄ κΈ°μ–΅ν•˜λŠ” μƒμœ„ μŠ€μ½”ν”„μ˜ μ‹λ³„μžλ₯Ό μ°Έμ‘°ν•  수 있으며 μ‹λ³„μžμ— λ°”μΈλ”©λœ 값을 λ³€κ²½ν•  μˆ˜λ„ μžˆλ‹€.

πŸ‘Ύ#01

const x = 1;

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

const innerFnc = outer();
innerFnc(); // 10

πŸ‘‰πŸ» 생λͺ…μ£ΌκΈ°κ°€ μ’…λ£Œν•œ μ™ΈλΆ€ ν•¨μˆ˜(outer)의 λ³€μˆ˜(x)λ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” μ€‘μ²©ν•¨μˆ˜(inner)λ₯Ό ν΄λ‘œμ €λΌκ³  ν•œλ‹€!

πŸ‘‰πŸ» outer ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ μ œκ±°λ˜μ§€λ§Œ outer ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ ν™˜κ²½κΉŒμ§€ μ†Œλ©Έν•˜λŠ” 것은 μ•„λ‹ˆλ‹€.

● ν΄λ‘œμ €μ˜ ν™œμš©

  • ν΄λ‘œμ €λŠ” μƒνƒœλ₯Ό μ•ˆμ „ν•˜κ²Œ λ³€κ²½ν•˜κ³  μœ μ§€ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.
  • μƒνƒœλ₯Ό μ•ˆμ „ν•˜κ²Œ μ€λ‹‰ν•˜κ³  νŠΉμ • ν•¨μˆ˜μ—κ²Œλ§Œ μƒνƒœ 변경을 ν—ˆμš©ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.

πŸ‘Ύ 카운트 μƒνƒœλ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•œ 자유 λ³€μˆ˜ counterλ₯Ό κΈ°μ–΅ν•˜λŠ” ν΄λ‘œμ €λ₯Ό λ°˜ν™˜

const counter = (function(){
  // 자유 λ³€μˆ˜
  let counter = 0;
  
  return function(fn){
    counter = fn(counter);
    return counter;
  };
}());

// 보쑰 ν•¨μˆ˜
function increase(num){
  return ++num;
}
// 보쑰 ν•¨μˆ˜
function decrease(num){
  return --num;
}

// 보쑰 ν•¨μˆ˜λ₯Ό μ „λ‹¬ν•˜μ—¬ 호좜
console.log(counter(increase)); // 1
console.log(counter(increase)); // 2
// 자유 λ³€μˆ˜λ₯Ό κ³΅μœ ν•œλ‹€.
console.log(counter(decrease)); // 1
console.log(counter(decrease)); // 0
profile
즐겁게 κ°œλ°œν•˜μž μ₯¬μ•Όν˜ΈπŸ‘»

0개의 λŒ“κΈ€