首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

缓存调用步骤结果(转)

2012-07-29 
缓存调用方法结果(转)//?memoize:?使用memoization来缓存的通用方法???//?func:?要被缓存的方法???//?cont

缓存调用方法结果(转)

    //?memoize:?使用memoization来缓存的通用方法???//?func:?要被缓存的方法???//?context:?方法执行上下文???//?Note:?方法必须是外部可访问的,参数是可字符序列化的???function?memoize?(func,?context)?{???????function?memoizeArg?(argPos)?{?//参数表示原始方法中参数的位置???????????var?cache?=?{};?//这个缓存的key是参数,value是执行结果???????????return?function?()?{?//返回一个函数闭包???????????????if?(argPos?==?0)?{?//第一个参数,如果参数在缓存的key中不存在,就执行原始函数并且存储执行结果???????????????????if?(!(arguments[argPos]?in?cache))?{???????????????????????cache[arguments[argPos]]?=?func.apply(context,?arguments);???????????????????}???????????????????return?cache[arguments[argPos]];???????????????}???????????????else?{?//不是第一个参数,如果参数在缓存的key中不存在,就递归执行memoizeArg方法,原始方法中参数的位置-1???????????????????if?(!(arguments[argPos]?in?cache))?{???????????????????????cache[arguments[argPos]]?=?memoizeArg(argPos?-?1);???????????????????}???????????????????return?cache[arguments[argPos]].apply(this,?arguments);???????????????}???????????}???????}???????var?arity?=?func.arity?||?func.length;?//func参数的长度,javascript中用length属性,其它的用arity属性???????return?memoizeArg(arity?-?1);?//从最后一个参数开始递归???}???

?

var mem = memoize(func, this);??
alert(mem.call(this,"a",1,2));??
alert(mem.call(this,"y",0,2));?

?

函数闭包中在递归调用时,每次都会保持着一个指向递归函数的引用

热点排行