ํด๋ก์ (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();