Digital Recipe

Closures in Javascript 본문

프로그래밍/웹/스크립트

Closures in Javascript

노리터 2012. 11. 11. 02:19

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


Comments