자바 스크립트는 함수형 언어들과 마찬가지로 클로저(closure)를 지원한다.

function sayHello(name) {
  var text = 'Hello ' + name; // local variable
  var sayAlert = function() { alert(text); }
  return sayAlert;
}

위 함수 sayHello()의 리턴 값은 또 다른 함수인 function() { alert(text); }이다. 이렇게 얻은 함수는 다음과 같이 호출할 수도 있다.

var fun = sayHello('Jane')
fun();


함수 안에 함수를 정의하는 중첩 함수(nested function)의 개념은 어렵지 않지만, 클로저는 중첩 함수에 대한 단순 함수 포인터만은 아니다. sayHello() 함수에서 text는 지역 변수이므로 스택에 할당하는 구조를 따른다면 sayHello() 함수가 리턴된 후에는 더 이상 text 변수의 값을 읽을 수 없어야 한다. 자바스크립트에서 function() { alert(text); } 같이 클로저를 선언하면 클로저 내부에서 참조하는 지역 변수인 text를 마치 힙에 할당한 것처럼 보존한다. (즉 클로저에 대한 감춰진 포인터가 하나 더 있는 셈이다.) 따라서 sayHello() 함수가 리턴된 후에도 클로저를 호출했을 때 text 변수의 값을 읽을 수 있는 것이다.

자세한 내용은 참고 문서를 참조하기 바란다.


참고 문서
[1] JavaScript Closures 101- they're not magic
http://www.javascriptkit.com/javatutors/closures.shtml

[2] More closure examples
http://www.javascriptkit.com/javatutors/closures2.shtml

  1. Favicon of http://blog.naver.com/minis24 BlogIcon minis24

    | 2009.11.09 14:32 | PERMALINK | EDIT | REPLY |

    클로저는 가비지컬렉션(gc)의 작동방식을 이용한 방법인데요..자바스크립트 클래스에서 프라이빗 변수를 선언할때 사용하면 유용합니다.

    맨처음 발견한 개발자도 프라이빗 변수를 만들때 사용했죠~

    자바스크립트에서 gc는 아무런 참조가 없는 객체를 메모리에서 삭제하지요...하지만 클로저를 사용하여 참조를 리턴하게 되면 함수가 실행이 끝난뒤에도 참조가 살아 있기 때문에 객체가 메모리에서 삭제되지 않고 사용할 수 있게 되는것입니다..

Write your message and submit
« PREV : 1 : ··· : 142 : 143 : 144 : 145 : 146 : 147 : 148 : 149 : 150 : ··· : 244 : NEXT »