ํด๋กœ์ €(Closure)

  • ํด๋กœ์ €(closure)๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ๋งฅ๋ฝ(context)์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๊ฐ€๋ฅดํ‚จ๋‹ค. ํด๋กœ์ €๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•œ ๊ณ ๋‚œ์ด๋„์˜ ํ…Œํฌ๋‹‰์„ ๊ตฌ์‚ฌํ•˜๋Š”๋ฐ ํ•„์ˆ˜์ ์ธ ๊ฐœ๋…์œผ๋กœ ํ™œ์šฉ๋œ๋‹ค.

  • ์˜ˆ์ œ ์ฝ”๋“œ

function outter(){
    var title = 'coding everybody'; // ์™ธ๋ถ€ ํ•จ์ˆ˜
    return function(){  // ๋‚ด๋ถ€ ํ•จ์ˆ˜
        alert(title);
    }
}
inner = outter(); // ๊ฒฐ๊ณผ๊ฐ’์ด ์—†๋‹ค.
inner(); // ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” alert(title);
  • ํด๋กœ์ €๋ž€ ๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๊ณ , ์™ธ๋ถ€ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ์†Œ๋ฉธ๋  ๋•Œ๊นŒ์ง€ ์†Œ๋ฉธ๋˜์ง€ ์•Š๋Š” ํŠน์„ฑ์„ ์˜๋ฏธํ•œ๋‹ค.

ํด๋กœ์ €๋ฅผ ์ด์šฉํ•ด์„œ private Method ํ‰๋‚ด๋‚ด๊ธฐ

  • ์•„๋ž˜๋Š” ํ”„๋ผ์ด๋น— ํ•จ์ˆ˜์™€ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๋Š” ํผ๋ธ”๋ฆญ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ชจ๋“ˆ ํŒจํ„ด์ด๋ผ ํ•œ๋‹ค.
var counter = (function() { // ์ต๋ช… ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋งŒ๋“ค์–ด์ง„๋‹ค
  var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return { // Return ๊ฐ์ฒด
    increment: function() {
      changeBy(1);
    },
    decrement: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  };
})();
 
console.log(counter.value()); // logs 0
counter.increment();
counter.increment();
console.log(counter.value()); // logs 2
counter.decrement();
console.log(counter.value()); // logs 1

ํด๋กœ์ ธ ๋ฐ”์ธ๋”ฉ ์‹œํ‚ค๊ธฐ

function showHelp(help) {
  document.getElementById('help').innerHTML = help;
}
 
function setupHelp() {
  var helpText = [
      {'id': 'email', 'help': 'Your e-mail address'},
      {'id': 'name', 'help': 'Your full name'},
      {'id': 'age', 'help': 'Your age (you must be over 16)'}
    ];
 
  for (var i = 0; i < helpText.length; i++) {
    (function() {
       var item = helpText[i];
       document.getElementById(item.id).onfocus = function() {
         showHelp(item.help);
       }
    })(); // ์ต๋ช… ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  }
}
 
setupHelp();

Let ํ‚ค์›Œ๋“œ ์‚ฌ์šฉํ•˜๊ธฐ

  • let ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ธ”๋ก ๋ฒ”์œ„ ๋ณ€์ˆ˜๋ฅผ ๋ฐ”์ธ๋”ฉํ•จ์œผ๋กœ์จ ์ถ”๊ฐ€์ ์ธ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
function showHelp(help) {
  document.getElementById('help').innerHTML = help;
}
 
function setupHelp() {
  var helpText = [
      {'id': 'email', 'help': 'Your e-mail address'},
      {'id': 'name', 'help': 'Your full name'},
      {'id': 'age', 'help': 'Your age (you must be over 16)'}
    ];
 
  for (var i = 0; i < helpText.length; i++) {
    let item = helpText[i];
    document.getElementById(item.id).onfocus = function() {
      showHelp(item.help);
    }
  }
}
 
setupHelp();

Reference