클로저란?
한마디로 정의 내리기가 어렵다.
그래서 두가지 예를 들겠음.
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;
};
이 함수 자체가 리턴된다ㅋㅋㅋㅋ
그래서 이런점을 이용해서 커링이라는 것을 할 수가 있다.
커링에 대해서는 다음 기회에...
'개발 > Javascript' 카테고리의 다른 글
[jQuery] div position 움직이기 (0) | 2012.12.07 |
---|---|
[jQuery] 이미지 서서히 나타나게 하기 (0) | 2012.12.06 |
JAVA spring 프레임워크로 하는 JqGrid cell 값 수정 (edit) (17) | 2012.09.14 |
Java와 jqgrid 기초!! (15) | 2012.09.12 |
Ajax로 받아온 데이터에 이벤트 걸기 (0) | 2012.07.30 |