Digital Recipe
Closures in Javascript 본문
Closures in Javascript
David Semeria From Imframework.com
(http://www.slideshare.net/hymanroth/closures-in-javascript)
[Page 1] Scope, Garbage Collection & Closures
[한글번역] HoSeok Seo (www.spz.kr)
[Page 2] Core Concepts
- 비록 Javascript가 블록 문맥 {}을 가지고 있더라도, 함수들(functions)만이 전역범위(Global scope)에 새로운 범위를 생성할 수 있다. (여기서 범위란 Javascript의 하나의 함수가 수행되기 위해 생성하는 추상적 개념으로 하나의 단위가 된다. 자세한 것은 별도로 확인바란다.)
- 함수가 종료될 때, 해당 함수범위 안에 다른 활성화(Active)된 범위에 의해 참조되는 컨텐츠가 없는 경우 이 함수범위는 사라진다.
- 대안으로, 사라지는 함수의 일부 컨텐츠가 다른 범위에서 참조되는 경우, 참조가 유지되는 동안 이 함수의 범위는 사라지지 않고 유지된다.
여기서 Scope는 범위로 번역하였으며, 그 의미는 수행을 위해 메모리 내에 생성하는 추상적인 영역 혹은 메모리 영역정도로 보면 된다.
[Page 3] In Pictures..
함수의 수행 이후의 함수 생명주기는 오로지 그들의 컨텐츠를 참조하는 활성화된 외부참조에 의존된다.
[Page 4] Scope Persistence
하나의 범위는 그들의 컨텐츠가 유지되는 동안 함께 유지된다. 위를 보면, f()는 컨텐츠 중 obj가 외부참조 되었기 때문에 함께 유지된다. 클로져는 함수가 종료되더라도 함수의 범위가 유지되는 특별한 경우이며, 다음과 같은 형태를 지니고 있다.
- 함수에 대한 외부참조가 존재한다.
- 바깥함수의 변수에 대해 접근(사용)한다.
[Page 5] Closures
Closure는 전역범위(Global scope)에 정의(define)되지 않은 함수가 활성화된 범위안의 객체(Object)로부터 참조되는 동안 (직접적이든 간접적이든) 발생된다. 여기서 활성화된 범위란 이 함수에 의해 생성되고 이 함수가 종료된 이후 활성화된 범위를 말한다. 이와 같은 경우, 참조된 함수의 범위와 그것을 둘러쌓는 것들은 외부에서 참조되는 동안 가능한 오래 유지된다.
[Page 6] Closure?
이 예제는 Closure인가?
[Page 7] Closure?
아니다. f()가 수행되고, 그것은 g() 호출한다. 그리고 이 2개의 함수는 종료된다. 이때 g()에 대한 활성화된 참조가 없기 때문이다.
[Page 8] A Simple Closure
그러면 예제를 살펴보자. 먼저 f()가 종료된 이후에 존재하는 참조를 살펴보자.
[Page 9] A Simple Closure
여기서 우리가 가지고 있는 유일한 외부참조는 m()을 가르키고 있는 instance이다.
[Page 10] A Simple Closure
m() 안에는 x에 대한 참조가 있다. 주어진 x는 우리가 기억하길 원하는 변수이다. 우리는 그것(변수 x)이 계속 살아있는 것을 볼 수 있다. 왜냐하면 그것은 간접적으로 전역범위에서 참조되고 있기 때문이다.
[Page 11] A Simple Closure
f()가 수행될 때마다, 새로운 범위가 생성되고, m()도 역시 생성된다. 전역범위 안에 주어진 m()을 참조하는 존재하는 동안, m()의 범위와 그것의 부모(범위)도 계속 지속된다. 이 경우, 각 m()은 올바른 x의 값에 접근하게 된다.
[Page 12] A Simple Closure (digging deeper)
변수 u는 어떨까? f()가 종료된 이후 이것은 여전히 f() 범위 내에 있는가?
[Page 13] A Simple Closure (digging deeper)
아마도 아니다. 다시보면 누가 신경이나 쓰겠는가? 가비지 콜렉션은 변수 u에 대한 활성화 된 참조가 없다고 보고 그것을 삭제할 것이다. 우리는 범위가 유지될 때 모든 컨텐츠가 함께 유지된다고 이야기하지 않았다. 가비지 컬렉션은 우리가 접근하는 수단이 없는 것에 대해서만 삭제한다.
2012. 11. 11
Originally posted by HoSeok Seo