함수 프로퍼티(메모이제이션)


함수는 객체이기 때문에 프로퍼티를 가질 수 있다. 함수는 처음부터 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 = {};


+ Recent posts