함수 지향 - 클로저
포스트
취소

함수 지향 - 클로저

클로저(Closure)란?

  • 내부 함수가 외부 함수의 맥락 (context)에 접근할 수 있는 것
  • function test(){}는 var test = function(){};와 같다.

내부 함수란?

  • 함수 안에서 또 다른 함수를 선언할 수 있는 JavaScript 문법
  • 내부 함수는 외부 함수의 지역 변수에 접근할 수 있다.
function outside(){
    function inside(){
        var text = "text";
        console.log(text);
    }
    inside();
}
outside();

//위의 함수를 아래처럼 바꿔도 정상적으로 작동한다.
//inside(text)로 선언된 것이 아니라 inside()로 인자가 없다고 선언되어있음에도
//내부 함수이기 때문에 외부 함수의 지역 변수인 text를 사용할 수 있는 것이다.
function outside(){
    var text = "text";
    function inside(){
        console.log(text);
    }
    inside();
}
outside();

//또 다른 방식으로도 사용 가능하다.
function inside(){
    var text = "text";
    return function (){ console.log(text); }
}
var outside = inside();
outside();

프라이빗 변수(private variable)란?

  • 아무나 수정할 수 있는 것을 방지한 변수
function factory_movie(title){
    return {
        get_title : function (){
            return title;
        },
        set_title : function(setTitle){
            if(typeof setTitle === 'String'){
                title = setTitle;
            }
            else{
                alert('제목은 문자열이어야 합니다.');
            }
        }
    }//객체 리턴
}

ironman = factory_movie('iron'); //실행 1

alert(ironman.get_title()); //실행 2

ironman.set_title('iron man'); //실행 3

alert(ironman.get_title()); //실행 4

//해설
/*
    1. ironman이라는 전역 변수에 factory_movie(title)을 실행해서 객체로 초기화
    2. ironman.get_title()을 사용했더니 'ironman'이 아니라 'iron'이 출력된다. 이룰 수정하려고 한다.
    3. ironman의 title을 set_title(setTitle)을 통해서 'ironman'로 변경했다.
    4. 정상적으로 'ironman'으로 출력된다.
*/

//추가 해설 (set_title의 작동에 대한 이해)
/*
    1. factory_movie(title)에서 title은 factory_movie(title)의 매개 변수가 되는 것이다.
    2. 이것은 factory_movie라는 함수 안에 title이라는 지역 변수가 있음을 의미한다.
    3. 클로저(closure)는 내부 함수가 외부 함수의 지역 변수에 접근할 수 있는 것을 의미한다.
    4. 즉, return으로 반환하는 객체의 내부 함수인 set_title은 factory_movie의 지역 변수인 title에 접근이 가능하다.
*/

클로저 사용시 주의점

  • 클로저라는 것은 내부 함수가 외부 함수의 지역 변수를 접근할 수 있다.
    • for문의 조건식의 i같은 변수에 바로 접근할 수 있다는 뜻은 아니다.
// for문의 i같은 변수에 접근하는 방법
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]());
}

//해설
/*
    1. 우선, for문이 실행되면 arr[i] = function(id) {...}(i);가 된다.
       즉, arr[i]안에 명시된 i를 익명 함수의 id라는 매개 변수로 주어서
       함수를 실행하는 것하며 그 결과를 저장한다.
    2. 현재 익명 함수 안에는 또 다른 익명 함수가 있다.
       현재 외부 함수에는 i의 값을 받아 초기화 시킨 id라는 매개 변수가 있다.
    3. 그렇기 때문에 내부 함수에서 외부 함수의 지역 변수인 id에 접근해서
       그 값을 리턴해줄 수 있게 되는 것이다.
*/
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.