본문 바로가기

Web For All/jQuery

자바스크립트 클로저

참조: http://decoder.tistory.com/623

더글라스 크록포드의 자바스크립트 핵심 가이드
http://hanb.co.kr/look.php?isbn=978-89-7914-598-4

어찌됐건 자바스크립트를 다뤄야 하고, 또 잘 다루고 싶다면 이 책을 읽어볼 것을 권장한다. 또는 나처럼 당장 자바스크립트를 쓰고 있지는 않더라도 자바스크립트와 같은(??) 언어에 대해 관심이 있다면 읽어볼 만하다. 책은 얇지만 그리 쉽게 읽을 순 없을 듯. ㅋㅋ

이 책에선 클로저를 유효범위(scope)로 인해 발생할 수 있는 문제를 해결하는 한 방법으로 기술하고 있다. 자바스크립트에는 블록 유효범위가 없고, 대신 함수 유효범위가 있기 때문에 함수 내에서 정의된 매개변수와 인자에 대해서는 내부에 정의된 함수에서 자유로이 접근이 가능하다.

그런데 외부 함수보다 내부 함수가 더 오래 유지되고, 외부 함수에 정의된 변수를 함수 외부에서는 접근하지 못하게 하고 싶은 경우에는 다음과 같이 코드를 작성할 수 있다.

var myObject = function() {
   var value = 0;

   return {
      increment: function(inc) {
         value += typeof inc === 'number' ? inc : 1;
      },
      getValue: function() {
         return value;
      }
   };
} ();

myObject에는 함수를 호출한 결과를 할당한다(맨 마지막 ()). 함수는 메서드 두 개를 가진 객체를 반환하며, 이 두 메서드는 계속해서 value라는 변수에 접근할 수 있다.

이번에는 좀 더 다른 코드.
var Quo = function(string) {
   this.status = string;
};

Quo.prototype.get_status = function() {
   return this.status;
};

이렇게 코드를 작성하면 get_status 함수는 별 가치가 없다. status 변수에 직접 접근할 수 있기 때문이다. status 변수를 private으로 만들기 위해 다음과 같은 코드를 작성한다.

var quo = function(status) {
   return {
      get_status: function() {
         return status;
      };
   }
};

var myQuo = quo("amazed");
document.writeln(myQuo.get_status());

get_status 함수는 quo가 반환된 뒤에도 quo의 status에 계속해서 접근가능하다. get_status는 status 매개변수의 복사본이 아닌 매개변수 자체에 대한 접근 권한을 갖기 때문이다. 이것이 가능한 것은 "함수가 자신이 생성된 함수, 즉 자신을 내포하는 함수의 문맥(context)에 접근할 수 있기 때문이다". 이것을 클로저라 한다.

이 뒤에 나오는 예제도 있는데, 고건 잘 이해가 안되서 몇 번째 다시 읽어보고 있는 중이다. 낄낄.

클로저와 관련된 다른 글들... 다른 글도 좀 읽어봐야 하는데, 일단 걸어나 두세!
Java theory and practice: 클로저(closure) 논의 (한글)
http://www.ibm.com/developerworks/kr/library/j-jtp04247.html

C++기반의 closure
http://rein.upnl.org/wordpress/archives/485

클로저 (Closure) - 마틴 파울러
http://newlord.egloos.com/1978181

Closure Impl. in Java
http://mkseo.pe.kr/blog/?p=1721

Javascript Closures
http://www.jibbering.com/faq/faq_notes/closures.html

Closures for the Java Programming Language (aka BGGA)
http://www.javac.info/
http://tronicek.blogspot.com/2007/12/closures-closure-is-form-of-anonymous_28.html