JavaScript를 하면서 어려웠던 새로운 개념이 Closure이다. 이참에 조금 정리해 보도록 하자
▶ Closure 개념
- 로컬 변수를 참조하고 있는 함수 내의 함수 (JavaScript 마스터북, Jpub출판, p180)
- 즉, 클로저는 자신의 범위(Scope) 밖에 있는 변수들에 접근할 수 있는 함수를 의미한다
- inner function을 return 할때 closure가 된다 (원문)
function outerFn() {
var count=1;
return function (cnt) {
count += cnt;
console.log(count);
}
}
var func = outerFn();
func(10); // 결과 값 11
func(10); // 결과 값 21
1) func가 closure가 됨 : 내부 변수들 closure, private 변수 생성됨
2) func(parameter) 호출해 줘도 내부 변수들은 다시 생성되는 것이 아니라 상태를 유지시켜서 참조 됨
3) 즉, 클로저가 만들어 지면서 내부 변수들은 별도로 유지되면서 상태값을 유지함
4) 클로저의 참조를 제거하고 GC할려면 명시적으로 func=null; 함
- 로컬 변수를 계속 생성하지 않고 상태를 유지하면 사용할 수 있다 (마치 객체처럼 var bar2 = foo(2); 하면 또 다른 closure가 생성되면서 bar와 별도의 상태공유 변수 x와 tmp가 생성된다. 마치 클래스에서 객체생성하는 것 처럼 된다. closure 생성시에 arguement와 var로 선언된 variable 에 대한 참조가 가능해 진다. 결국 참조자들-x, tmp-가 일정 메모리에 저장되어 상태를 유지한다)
- 위의 예에서 var bar = foo(2);를 하는 순간 foo function 객체의 x, tmp 변수의 레퍼런스를 closure 가 가진다 (즉, x, tmp 에 대한 변수 상태값이 유지되고, y 값은 bar(10)을 호출할 때 넘겨주는 값이 된다)
- 클로저는 간단한 객체이다 (엄밀히 따져서 객체는 아니지만 객체식으로 치환해서 살펴보면 다음과 같다)
+ 클로저 : 객체 = 클로저를 감싸고 있는 부모 함수 foo : 생성자
+ 클로저 : 객체 = 클로저로 부터 참조되는 로컬 변수 tmp : 프로퍼티
+ 클로저 : 객체 = 클로저 자신 bar, bar2 : 메소드
+ 클로저 : 객체 = var bar = foo(2) 함수 호출 : 인스턴스화
+ 클로저 : 객체 = 클로저를 대입하는 변수 bar(10), bar2(10) : 인스턴스 <-- 요거 애매함
- function 내부에 for문을 돌면서 function을 호출하여 callback 을 셋팅하는 오류 제거 (원문1, 원문2)
<참조>
- 소스니 코브 : Closure 이해하기
- Closure 정리 : 한글이라 이해하기 쉬울것임
- Inside.JS : 한글 정리 예제 포함
'Languages > JavaScript' 카테고리의 다른 글
[JavaScript 성능향상] 웹사이트 최적화 방법 (0) | 2012.12.12 |
---|---|
[JavaScript] Template Engine (0) | 2012.11.26 |
[JavaScript] Function Expression 과 Function Declaration 차이 (0) | 2012.11.12 |
[JavaScript] Core 요약 (0) | 2012.10.12 |
[JavaScript] Design Pattern (0) | 2012.09.10 |