클로저란 무엇인가? (Closure)
클로저란?
한마디로 정의 내리기가 어렵다.
그래서 두가지 예를 들겠음.
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;
};
이 함수 자체가 리턴된다ㅋㅋㅋㅋ
그래서 이런점을 이용해서 커링이라는 것을 할 수가 있다.
커링에 대해서는 다음 기회에...