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노드 등 호스트 객체들은 원형을 참조 하면 해지를 하지 못한다.
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기