closure

๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ๋งฅ๋ฝ(context)์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์–ด๋–ค ๋ฐ์ดํ„ฐ(์–ดํœ˜์  ํ™˜๊ฒฝ)๊ณผ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์—ฐ๊ด€์‹œ์ผœ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์šฉํ•˜๋‹ค. ์ด๊ฒƒ์€ ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ๋ฐ์ดํ„ฐ์™€ (๊ทธ ๊ฐ์ฒด์˜ ์†์„ฑ) ํ•˜๋‚˜ ํ˜น์€ ๊ทธ ์ด์ƒ์˜ ๋ฉ”์†Œ๋“œ๋“ค์„ ์—ฐ๊ด€์‹œํ‚จ๋‹ค๋Š” ์ ์—์„œ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋ถ„๋ช…ํžˆ ๊ฐ™์€ ๋งฅ๋ฝ์— ์žˆ๋‹ค.(MDN์ฐธ์กฐ)

๋‚ด๋ถ€ํ•จ์ˆ˜์™€ ์™ธ๋ถ€ํ•จ์ˆ˜

function outter(){
    function inner(){
        var title = 'coding everybody';
        console.log(title);
    }
    inner();
}
outter();

์ด๋ ‡๊ฒŒ ์“ฐ๋Š” ๊ฒฝ์šฐ๋Š” ์ฃผ๋กœ outter์ด๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ ์ด ์•ˆ์—์„œ inner๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์“ด๋‹ค. ๋งŒ์•ฝ ์ด ํ•จ์ˆ˜๋ฅผ outter ๋ฐ”๊นฅ์— ์ •์˜ํ•œ๋‹ค๋ฉด ์‘์ง‘์„ฑ์ด ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— outter ์•ˆ์— ์ •์˜ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ์ฃผ๋ชฉํ• ์  title ์ด๋ผ๋Š” ๋ณ€์ˆ˜๋Š” ์™ธ๋ถ€ํ•จ์ˆ˜์— ์ •์˜๋˜์–ด ์žˆ๋Š” ์ง€์—ญ๋ณ€์ˆ˜์ด๋‹ค. inner์ด๋ผ๋Š” ํ•จ์ˆ˜๋Š” title์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ inner์•ˆ์— title์ด๋ผ๋Š” ์ง€์—ญ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” inner๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋ฐ”๊นฅ์ชฝ ํ•จ์ˆ˜์—์„œ title์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค!

๋‚ด๋ถ€ํ•จ์ˆ˜์—์„œ ์™ธ๋ถ€ํ•จ์ˆ˜์— ์žˆ๋Š” ์ง€์—ญ๋ณ€์ˆ˜์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์™ธ๋ถ€ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ๋๋‚˜๋„ ๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ํ•จ์ˆ˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

function outter(){
    var title = 'coding everybody';
    return function(){
        console.log(title);
    }
}
inner = outter();
inner();

inner๋ผ๋Š” ๋ณ€์ˆ˜์— outter()๋ฅผ ๋‹ด๋Š”๊ฒƒ์€ return๋‹ค์Œ ๊ฐ’์„ ๋‹ด๋Š” ๊ฑฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€. ์—ฌ๊ธฐ์„œ ์ด์ƒํ•˜๊ฒŒ ์ƒ๊ฐํ•  ์ ์€ outter()๋ผ๋Š”๊ฑธ ์‹คํ–‰ ํ›„(returnํ•œ ํ›„) ์™ธ๋ถ€ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ inner์— ๋„ฃ์–ด์คฌ๋Š”๋ฐ.. inner()๋ฅผ ๋˜ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ํŠน์ด์ ์ด๋‹ค.

inner()๋งŒ ์‹คํ–‰ํ•ด๋„ ์™ธ๋ถ€ํ•จ์ˆ˜๋Š” ์ฃฝ์—ˆ์ง€๋งŒ ์™ธ๋ถ€๋ณ€์ˆ˜์ธ title์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Private variable

์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์ปค์ง€๋Š” ๊ณผ์ •์—์„œ ์–ด๋– ํ•œ ์ •๋ณด๊ฐ€ ์žˆ์„ ๋•Œ, ๊ทธ ์ •๋ณด๋ฅผ ์•„๋ฌด๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ.

function factory_movie(title){
    return {
        get_title: function(){
            return title;
        },
        set_title: function(_title){
            title = _title;
        }
    }
}
ghost = factory_movie('Ghost in the shell');
matrix = factory_movie('Matrix');
console.log(ghost.get_title());
console.log(matrix.get_title());

๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜์— ๊ทธ ๊ฐ์ฒด์—” 2๊ฐœ์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋‹ค. get_title๊ณผ set_title์€ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋‹ค.

๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ์†Œ์†๋œ ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

title์ด๋ผ๋Š” ์™ธ๋ถ€๋ณ€์ˆ˜์˜ ํ•จ์ˆ˜์— ๋‹ด๊ธด๊ฐ’์€ ์„œ๋กœ ๋‹ค๋ฅด๋‹ค.

function factory_movie(title){
    return {
        get_title: function(){
            return title;
        },
        set_title: function(_title){
            title = _title;
        }
    }
}
ghost = factory_movie('Ghost in the shell');
matrix = factory_movie('Matrix');
console.log(ghost.get_title());
console.log(matrix.get_title());

ghost.set_title('๊ณต๊ฐ๊ธฐ๋™๋Œ€');
console.log(ghost.get_title());
console.log(matrix.get_title());

2๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ , ๊ทธ๊ฒƒ๋“ค์ด ์‹คํ–‰๋˜๋Š” ๋งฅ๋ฝ(context) ๊ทธ ์‹œ์ ์— ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ๊ทธ ์ง€์—ญ๋ณ€์ˆ˜๋Š” ์œ ์ง€๊ฐ€ ๋˜๊ณ  ์žˆ๋‹ค. ghost.set_title('๊ณต๊ฐ๊ธฐ๋™๋Œ€')๋ฅผ ํ•œ๋‹ค๋Š”๊ฑด ghost์˜ title๋งŒ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด์ง€ matrix์—๋Š” ์–ด๋– ํ•œ ์˜ํ–ฅ๋„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.

์ด ์ฝ”๋“œ์—์„œ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋Š” private variable์€ ๋ฌด์—‡์ธ๊ฐ€? get_title๊ณผ set_title์€ ์–ธ์ œ๋“ ์ง€ ์ ‘๊ทผ๊ฐ€๋Šฅํ•œ ๋ฉ”์†Œ๋“œ๋‹ค. ์˜คํ”ˆ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, get_title๊ณผ set_title์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜๋Š” ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜์ธ title์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜๋Š” ์™ธ๋ถ€ํ•จ์ˆ˜๊ฐ€ ๋ฆฌํ„ดํ–ˆ์„ ๋•Œ ํ•จ์ˆ˜์ž์ฒด๋Š” ์ƒ์ด ๋งˆ๊ฐ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง€์—ญ๋ณ€์ˆ˜๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž์ฃผ์žˆ๋Š” ์‹ค์ˆ˜ ์ฝ”๋“œ

var arr = [];
for(var i = 0; i < 5; i++){
    arr[i] = function(){
        return i;
    }
}
for(var index in arr) {
    console.log(arr[index]());
}

for๋ฌธ์„ ์ด์šฉํ•ด ๋ฐฐ์—ด์— for๋ฌธ์„ ๋‹ด๊ณ  ์‹ถ๋‹ค! ํ•˜์ง€๋งŒ,

์ถœ๋ ฅ๊ฒฐ๊ณผ 5๋งŒ 5๋ฒˆ ์ฐํžŒ๋‹ค. i์˜ ๊ฐ’์ด function์˜ ์™ธ๋ถ€๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค?? ๊ทผ๋ฐ ์™œ? 5๋Š” ๋‹ด๊ธธ๊นŒ..?

์ˆ˜์ • ์ฝ”๋“œ

var arr = [];
for(var i = 0; i < 5; i++){
    arr[i] = (function(id){
        return function(){
            return id;
        }
    })(i);
}
for(var index in arr) {
    console.log(arr[index]());
}

์ด์ „ return i๋ฅผ ํ•จ์ˆ˜๋ฅผ ๋‚ด๋ถ€ํ•จ์ˆ˜๋กœ ์ •์˜๋˜๋„๋ก ์™ธ๋ถ€ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ์ฐธ์กฐํ•˜๋„๋ก ํ•œ๋‹ค.

์™ธ๋ถ€ํ•จ์ˆ˜๋Š” ์ฆ‰์‹œ ์‹คํ–‰ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์งœ๊ณ  ๊ทธ ์ธ์ž๊ฐ’์œผ๋กœ i๋ฅผ ์ค€๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ง€์—ญ๋ณ€์ˆ˜์™€ ๋˜‘๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋‚ธ๋‹ค.

Last updated

Was this helpful?