함수 프로퍼티(메모이제이션)
함수는 객체이기 때문에 프로퍼티를 가질 수 있다. 함수는 처음부터 length 프로퍼티를 갖는다.
function fnc(a, b, c){}
console.log(fnc.length); // 3
다음 예제에서는 myFunc 함수에 cache 프로퍼티를 생성한다. cache 프로퍼티는 함수로 전달된 param 매개변수를 키로 사용하고 계산의 결과를 값으로 가지는 객체다.
var myFunc = function(param){
if(!myFunc.cache[param]){
var retult = {};
// 비용이 많이 드는 수행
myFunc.cache[param] = result;
}
return myFunc.cache[param];
};
// 캐시 저장공간
myFunc.cache = {};
만약 더 많은 매개변수와 더 복잡한 타입을 갖는다면 일반적으로 직렬화하여 해결할 수 있다. 예를들어, 객체 인자를 JSON문자열로 직렬화하고 이 문자열을 cache 객체에 키로 사용할 수 있다.
var myFunc = function(){
var cachekey = JSON.stringify(
// myFync로 전달되는 argument를 받아서 array 타입으로 변환
Array.prototype.slice.call(arguments))
, retult;
if(!myFunc.cache[cachekey]){
var retult = {};
// 비용이 많이 드는 수행
myFunc.cache[cachekey] = result;
}
return myFunc.cache[cachekey];
};
// 캐시 저장공간
myFunc.cache = {};
직렬화하면 객체를 식별할 수 없게 되는것을 주의해야 한다. 만약 같은 프로퍼티를 가지는 두 개의 다른 객체를 직렬화하면 이 두객체는 같은 캐시 항목을 공유하게 될것이다.
이 함수를 작성하는 다른 방법으로 함수 이름을 하드코딩하는 대신 arguments.callee를 사용해 함수를 참조할 수 있다.
** ECMAScript 5 스트릭트 모드에서는 허용되지 않는다.
var myFunc = function(maram){
var f = arguments.callee, retult;
if(!f.cache[param]){
var retult = {};
// 비용이 많이 드는 수행
f.cache[param] = result;
}
return f.cache[param];
};
// 캐시 저장공간
myFunc.cache = {};
'개발 > dev-patterns' 카테고리의 다른 글
자바스크립트 코딩 기법과 핵심 패턴 - 커리(Curry) (0) | 2019.08.13 |
---|---|
자바스크립트 코딩 기법과 핵심 패턴 - 설정 객체 패턴 (0) | 2019.08.09 |
자바스크립트 코딩 기법과 핵심 패턴 - 초기화 시점의 분기 (0) | 2019.08.06 |
자바스크립트 코딩 기법과 핵심 패턴 - 즉시 객체 초기화 (0) | 2019.08.06 |
자바스크립트 코딩 기법과 핵심 패턴 - 즉시 실행 함수 (0) | 2019.08.06 |