발췌 : 자바스크립트 핵심 가이드 (Douglas Crockford 저)
var add = function (a, b) {myObject를 객체 리터럴로 초기화하는 대신에 위 코드처럼 객체 리터럴을 반환하는 함수를 호출하여 초기화합니다. 이렇게 하면 increment와 getValue를 통해 value라는 변수에 접근할 수 있지만 함수 유효범위 때문에 프로그램의 나머지 부분에서는 접근할 수 없습니다.
return a + b;
}
var myObject = function ( ) {
var value = 0;
return {
increment: function (inc) {
value += typeof inc === 'number' ? inc : 1;
},
getValue: function ( ) {
return value;
}
}
}( );
myObject.double = function ( ) {
var that = this;
var helper = function ( ) {
that.value = add(that.value, that.value)
};
helper( );
};
myObject.increment( );
myObject.increment(2);
myObject.double( );
console.log(myObject.getValue( )); // why result is 3? I want to 6!
코드를 보면 myObject에 함수를 할당한 것이 아니라 함수를 호출한 결과를 할당하고 있습니다. 범위 마지막의 ()를 주목할 필요가 있습니다. 함수는 메소드 두 개를 가진 객체를 반환하며 이 두 메소드는 계속해서 value라는 변수에 접근할 수 있습니다.
이렇게, 함수가 자신이 생성된 함수, 즉 자신을 내포하는 함수의 문맥(context)에 접근할 수 있도록 하는 것을 클로저라고 합니다.
'IT노트 > javaScript' 카테고리의 다른 글
원하는 프레임만 프린트하기 (0) | 2015.03.01 |
---|---|
뒤로가기 버튼 javascript:history.back(-1) (0) | 2015.02.25 |
Ajax jsonp OR 서버측에서 크로스도메인 허용 방법 (0) | 2015.02.21 |
샘플 -basic _ popup.js (0) | 2015.02.20 |
자바스크립트 지나간 시간 계산 (0) | 2015.02.20 |