2014년 1월 19일 일요일

closure 정리


    //자바스크립트의 함수의 가비지컬랙터는 우선순위가 낮음
        function plus(a,b){
            var hap = a+b;
            return function(c){
                return hap += c||0;
            };
        }        //참조된 hap은 가비지컬렉팅 되지 않고 계속 살아있음

        var r = plus(3,4);       
        alert(r());        //7
        alert(r(3));    //10

//클로저 활용1
//1.setTimeout 함수 인자 제공
//본래 setTimeout은 function(){}  이런식으로 나와서 인자를 전달 할수 없음 하지만 이런식으로 클로저 활용하면 인자를 전달할수 있음.
//밖에서 참조를 해서 인자를 줄수 있긴 하다. 하지만 실제 함수가 호출 될 당시에는 줄 수 없다.
function callLater(a,b,c){
    return (function(){
        a[b] = c;
    });
}

window.onload = function(){
    var funcRef = callLater(document.body.style,"background","yellow");
    setTimeout(funcRef,500);
};








//2. 외부에 노출되지 않음

var div = (function(){
    var buffar = ["<div>","","</div>"];
    return (function(contents){
        buffar[1] = contents;
        return buffar.join("");
    });
})();

alert(div("a"));

//클로저는 메모리 누수 문제가 생길수 있음. 내가 모르는 사이에무언가에서 계속 메모리가 생성되어 가비지 컬렉팅되지 않는 현상이 발생 할 수 있음.
//특히 일반적인 것은 생관이 없는데 host객체들 (window, document, activeX 객체 같은 경우 특히 심함) 객체의 원형을 참조 하면, 브라우저가 종료 될때까지 해지가 되지 않는다. 일반적인 객체들은 1->2->3->1이 참조 되면 가비지 컬렉션 대상이 되지만 dom노드 등 호스트 객체들은 원형을 참조 하면 해지를 하지 못한다.

댓글 없음:

댓글 쓰기