티스토리 뷰

생활코딩/자바스크립트

클로저

선물공룡디보 2021. 8. 18. 21:37

 

 

클로저

클로저(closure)는 내부함수가 외부함수의 맥락(context)에 접근할 수 있는 것을 가르킨다. 클로저는 자바스크립트를 이용한 고난이도의 테크닉을 구사하는데 필수적인 개념으로 활용된다.

 

내부함수

function outter(){
	var title = 'coding everybody'; 
    function inner(){
        alert(title); //'coding everybody'; 
    }
    inner();
}
outter();

inner 함수에서 외부함수인 outter 함수의 title 변수에 접근할 수 있다.

 

클로저

내부함수는 외부함수의 지역변수에 접근 할 수 있는데 외부함수의 실행이 끝나서 외부함수가 소멸된 이후에도 내부함수가 외부함수의 변수에 접근 할 수 있다. 이러한 메커니즘을 클로저라고 한다.

function outter(){
    var title = 'coding everybody';  
    return function(){        
        alert(title);
    }
}
inner = outter();
inner(); //'coding everybody'

outter 함수에서 return 값이 반환되면 outter 함수가 소멸하게 되지만 익명함수에서 title 변수를 바라보고 있기 때문에
inner()을 실행하면 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');
 
alert(ghost.get_title()); //'Ghost in the shell'
alert(matrix.get_title());//'Matrix'
 
ghost.set_title('공각기동대');
 
alert(ghost.get_title()); //'공각기동대'
alert(matrix.get_title()); //'Matrix'

클로저의 특성을 이용해 setter 와 getter 을 설정하고 이것들을 객체로 반환하였다.
이 메서드들은 factory_movie의 지역변수 title의 값을 가리키고 있기때문에 이 함수가 종료 되어도 계속해서 이 변수를 사용하여 변경하고 접근할 수 있다.

 

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

for 문에 있는 i 값은 전역변수 이기 때문에 function 안에 있는 i 값은 클로저로 인해 전역변수 i 값을 가리키게 된다.
그렇기 때문에 결과값은 전부 5가 나오게된다.

'생활코딩 > 자바스크립트' 카테고리의 다른 글

함수호출  (0) 2021.08.18
argumnets  (0) 2021.08.18
값으로서의 함수와 콜백  (0) 2021.08.18
유효범위  (0) 2021.08.17
객체  (3) 2021.08.15
댓글