다음은 John Hann의 구현에서 나 왔으며이 코드는 주목을 받았으며,이 코드는 메소드 호출 결과를 영리한 방법으로 캐시했습니다.
코드 구문 분석 :
코드 사본은 다음과 같습니다.
// memoize : 캐시에 Memoization을 사용하는 일반적인 방법
// func : 캐시 할 메소드
// 컨텍스트 : 메소드 실행 컨텍스트
// 참고 :이 메소드는 외부에 액세스 할 수 있어야하며 매개 변수는 문자 서식입니다.
function memoize (func, context) {
morting memoizearg (argpos) {// 매개 변수는 원래 메소드에서 매개 변수의 위치를 나타냅니다.
var cache = {}; //이 캐시의 키는 매개 변수이고 값은 실행 결과입니다.
return function () {// 함수 폐쇄를 반환합니다
if (argpos == 0) {// 첫 번째 매개 변수, 캐시 된 키에 매개 변수가 존재하지 않으면 원래 함수가 실행되고 실행 결과가 저장됩니다.
if (! (Cache의 argpos]) {
캐시 [arguments [argpos]] = func.Apply (컨텍스트, 인수);
}
반환 캐시 [Arguments [argpos]];
}
else {// 첫 번째 매개 변수가 아닙니다. 캐시 된 키에 매개 변수가 존재하지 않으면 Memoizearg 메소드가 재귀 적으로 실행됩니다. 원래 방법 -1에서 매개 변수의 위치
if (! (Cache의 argpos]) {
캐시 [Arguments [argpos]] = memoizearg (Argpos -1);
}
반환 캐시 [Arguments [argpos]]. 적용 (this, arguments);
}
}
}
var Arity = func.arity || func.length; // func 매개 변수의 길이가 사용되며 Arity 속성은 JavaScript에서 사용됩니다.
반환 memoizearg (Arity -1); // 재귀는 마지막 매개 변수에서 시작됩니다
}
사용:
코드 사본은 다음과 같습니다.
var mem = memoize (func, this);
경고 (mem.call (this, 1,1,2));
경고 (mem.call (this, 2,1,2));
경고 (mem.call (this, 3,1,3));
경고 (mem.call (this, 2,2,4));
간단 해 보이지만 볼 때 이해하기 쉽지는 않지만 폐쇄 사용에 익숙하다면 이해하기 쉽습니다. 위의 Mem.Call에 대한 호출 후에는 나무가 형성됩니다. 각 노드는 폐쇄이고 각 클로저는 캐시가 있고 각 캐시 키는 트리 브랜치입니다.
(참고 : 위의 그림에서 "결과"도 폐쇄이지만 Argpos는 0이지만)
그러나 Limboy는 다음과 같은 여러 가지 방법이 있습니다.
코드 사본은 다음과 같습니다.
MEMOIZE (fn) {
var cache = {};
return function () {
var key = [];
for (var i = 0, l = arguments.length; i <l; i ++)
key.push (인수 [i]);
if (! (캐시의 키)))
캐시 [key] = fn.apply (this, arguments);
반환 캐시 [키];
};
}
구현은 더 쉽지만 매개 변수를 배열로 밀고 배열을 키로 처리하고 키는 문자열 유형 만 지원합니다. 따라서 사용할 때 (예를 들어, 객체 Tostring 후에는 "[객체 개체]"만 볼 수 있으며 그 기능이 위의 기능보다 약할 때이 지점에주의를 기울여야합니다.
이것을 개선하는 것은 어렵지 않습니다. 매개 변수로 다른 객체를 설정하면 원래 캐시 객체 와이 다른 매개 변수 객체는 ID와 관련이 있습니다.
코드 사본은 다음과 같습니다.
MEMOIZE (fn) {
var cache = {}, args = {};
return function () {
for (var i = 0, key = args.length; i <key; i ++) {
if (동등한 (args [i], arguments))
반환 캐시 [i];
}
args [key] = 인수;
캐시 [key] = fn.apply (this, arguments);
반환 캐시 [키];
};
}
간결한 기능적 방법으로 쓸 수있는 다른 방법이 있습니다.