ν΄λ‘œμ € (Closure)

ν΄λ‘œμ €λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 맀우 κ°•λ ₯ν•˜κ³  μ€‘μš”ν•œ κ°œλ… 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. ν΄λ‘œμ €λŠ” μ™ΈλΆ€ λ³€μˆ˜(μ™ΈλΆ€ λ ‰μ‹œμ»¬ ν™˜κ²½μ— μžˆλŠ” λ³€μˆ˜)λ₯Ό κΈ°μ–΅ν•˜κ³  μ ‘κ·Όν•  수 μžˆλŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. 이λ₯Όν…Œλ©΄, μ–΄λ–€ ν•¨μˆ˜κ°€ λ‹€λ₯Έ ν•¨μˆ˜ λ‚΄μ—μ„œ μ •μ˜λ˜κ³  κ·Έ ν•¨μˆ˜κ°€ μ™ΈλΆ€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ©΄, ν΄λ‘œμ €κ°€ ν˜•μ„±λ©λ‹ˆλ‹€.

ν΄λ‘œμ €λŠ” ν•¨μˆ˜κ°€ 선언될 λ•Œμ˜ λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(Lexical Scope)λ₯Ό κΈ°μ–΅ν•˜μ—¬, ν•¨μˆ˜κ°€ λ‹€λ₯Έ μŠ€μ½”ν”„μ—μ„œ ν˜ΈμΆœλ˜λ”λΌλ„ ν•΄λ‹Ή μŠ€μ½”ν”„μ˜ λ³€μˆ˜μ— μ ‘κ·Όν•  수 있게 ν•˜λŠ” κΈ°λŠ₯을 λ§ν•©λ‹ˆλ‹€.
var makeClosure = function() {
  var name = 'zero';
  return function() {
    console.log(name);
  };
};

var closure = makeClosure();
closure(); // 'zero'
        
makeClosure ν•¨μˆ˜κ°€ 싀행될 λ•Œ name λ³€μˆ˜κ°€ μƒμ„±λ˜κ³ , λ°˜ν™˜λœ λ‚΄λΆ€ ν•¨μˆ˜κ°€ ν΄λ‘œμ € 역할을 ν•©λ‹ˆλ‹€. ν΄λ‘œμ €μΈ λ‚΄λΆ€ ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ μŠ€μ½”ν”„μ— μ ‘κ·Όν•  수 있기 λ•Œλ¬Έμ— name λ³€μˆ˜μ— μ ‘κ·Όν•˜μ—¬ 값을 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λΉ„κ³΅κ°œ λ³€μˆ˜

λΉ„κ³΅κ°œ λ³€μˆ˜λŠ” ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ μ ‘κ·Όν•  수 μžˆλŠ” λ³€μˆ˜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 이 λ³€μˆ˜λŠ” ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ„ μ–Έλ˜κ±°λ‚˜ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λ˜μ§€ μ•ŠμœΌλ©΄μ„œλ„ ν΄λ‘œμ €λ₯Ό 톡해 μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€.
function makeCounter() {
  let count = 0;

  // λ‚΄λΆ€ ν•¨μˆ˜(ν΄λ‘œμ €)λ₯Ό λ°˜ν™˜
  return function() {
    return count++;
  };
}

// makeCounter ν•¨μˆ˜ 호좜둜 ν΄λ‘œμ € 생성
let counter = makeCounter();

// ν΄λ‘œμ €λ₯Ό 톡해 μ™ΈλΆ€ λ³€μˆ˜(count)에 μ ‘κ·Όν•˜κ³  값을 λ³€κ²½
console.log(counter()); // 0
console.log(counter()); // 1
console.log(counter()); // 2
        
        
  • makeCounter ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λ©΄μ„œ μƒˆλ‘œμš΄ λ ‰μ‹œμ»¬ ν™˜κ²½μ΄ λ§Œλ“€μ–΄μ§€κ³ , count λ³€μˆ˜κ°€ κ·Έ ν™˜κ²½μ— μ €μž₯λ©λ‹ˆλ‹€.
  • makeCounter ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ •μ˜λœ 읡λͺ… ν•¨μˆ˜(ν΄λ‘œμ €)κ°€ λ°˜ν™˜λ˜λ©΄μ„œ μ™ΈλΆ€ λ³€μˆ˜ count에 λŒ€ν•œ μ°Έμ‘°λ₯Ό μœ μ§€ν•©λ‹ˆλ‹€.
  • λ°˜ν™˜λœ 읡λͺ… ν•¨μˆ˜κ°€ counter λ³€μˆ˜μ— ν• λ‹Ήλ˜λ©΄μ„œ ν΄λ‘œμ €κ°€ ν˜•μ„±λ©λ‹ˆλ‹€.
  • counterλ₯Ό ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ ν΄λ‘œμ €λŠ” μ™ΈλΆ€ λ³€μˆ˜ count에 μ ‘κ·Όν•˜μ—¬ 값을 λ³€κ²½ν•˜κ³  λ°˜ν™˜ν•©λ‹ˆλ‹€.
ν΄λ‘œμ €λŠ” ν•¨μˆ˜κ°€ 생성될 λ•Œμ˜ λ ‰μ‹œμ»¬ μŠ€μ½”ν”„(μ–΄νœ˜μ  μŠ€μ½”ν”„)에 μžˆλŠ” λ³€μˆ˜μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό κΈ°μ–΅ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 ν•¨μˆ˜κ°€ λ‚˜μ€‘μ— 호좜될 λ•Œμ—λ„ ν•΄λ‹Ή λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν΄λ‘œμ €λŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°, 비동기 μž‘μ—…, 정보 은닉 λ“± λ‹€μ–‘ν•œ μƒν™©μ—μ„œ μ‚¬μš©λ˜λ©°, μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κ³ μœ ν•˜κ³  κ°•λ ₯ν•œ νŠΉμ§• 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

이벀트 λ¦¬μŠ€λ„ˆμ™€ ν΄λ‘œμ €

이벀트 λ¦¬μŠ€λ„ˆμ™€ ν΄λ‘œμ € κ΄€λ ¨ λ¬Έμ œμ— λŒ€ν•œ μ„€λͺ…μ—μ„œ, ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜μ—¬ 각 이벀트 ν•Έλ“€λŸ¬κ°€ 반볡문의 각 λ‹¨κ³„μ—μ„œ κ³ μœ ν•œ 인덱슀λ₯Ό κΈ°μ–΅ν•˜λ„λ‘ μˆ˜μ •ν•œ μ˜ˆμ œμž…λ‹ˆλ‹€.
for (var i = 0; i < 5; i++) {
  (function(j) {
    $('#target' + j).on('click', function() {
      alert(j);
    });
  })(i);
}
μ΄λ ‡κ²Œ ν•˜λ©΄ ν΄λ‘œμ €λ₯Ό 톡해 각 이벀트 ν•Έλ“€λŸ¬κ°€ μžμ‹ λ§Œμ˜ κ³ μœ ν•œ j 값을 κΈ°μ–΅ν•˜κ²Œ λ˜μ–΄, 클릭할 λ•Œ 각 λ²„νŠΌμ— ν•΄λ‹Ήν•˜λŠ” μΈλ±μŠ€κ°€ μ˜¬λ°”λ₯΄κ²Œ 좜λ ₯λ©λ‹ˆλ‹€. ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜μ˜ 값을 κ³ μ •μ‹œμΌœ 이벀트 ν•Έλ“€λŸ¬κ°€ μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜λ„λ‘ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.
같이 μ°Έκ³ ν•˜λ©΄ 쒋은 링크
https://www.zerocho.com/category/JavaScript/post/5741d96d094da4986bc950a0