개발/Javascript

클로저란 무엇인가? (Closure)

신매력 2012. 7. 30. 16:29

클로저란?

 

한마디로 정의 내리기가 어렵다.

그래서 두가지 예를 들겠음.

 

 

 

1.

아래 예제는 클로저를 사용하는 예제다.

 

outer함수랑 setTimeout함수가 있다.

setTimeout 함수로 인해서 outer함수가 끝나고 2초 뒤에 alert이 두번 띄워질텐데,

outer함수가 끝이 났으므로 그 안에 변수들도 소멸이 되어야 하는게 상식적인 생각이지만ㅋㅋ

외부 함수에 있는 변수를 내부 함수에서 접근할 수 있다. (생명주기가 끝났어도..)

이것이 클로저(closure).

(메모리 누수의 원인이라는 ㅋㅋ)

 


function outer(a) {

var b = "test";

 

setTimeout(function() {

alert(a);

alert(b);

}, 2000);

}



 

 

2.

요 아래 코드도 클로저의 예다.

 

var b=2;


function() {

var a=3;  // 밖에서 조작 불가

return a;

}();



 

이렇게 익명함수를 사용하면,

함수 내부에서는 외부의 값(b)을 쓸 수 있지만

함수안에 있는 변수는(a) 밖에서 절대 조작할 수 없다.

단, 리턴 되는 값만을 조작할 수 있다.

 

(); 부분에서 함수 콜을 했기때문에 이미 실행되버렸다.

결국 익명함수는 이미 실행되버렸고, 리턴 값만을 사용할 수 있다.

 

 

 

그러니깐 클로저를 정의 내리면? 유효범위가 1, 2 의 예처럼 된다는 것인데. 이걸 뭐라 설명하지????ㅠ

 

 

 

- 그리고 내가 헷갈렸던거 하나 추가로 설명하자면...

2번의 예제에서 만약 return 되는것이 함수일 경우 리턴된 값은 무엇일까???

 


function() {

var a=3;

return function() {

a+1;

};

}



 

 

나는 4일줄 알았는데...

 

function() {

a+1;

};

 

이 함수 자체가 리턴된다ㅋㅋㅋㅋ

그래서 이런점을 이용해서 커링이라는 것을 할 수가 있다.

커링에 대해서는 다음 기회에...