使用备忘模式,利用了函数的自定义属性,先看一个例子

var test = function (){}
test.myAttr = "attr";

这样,就给test加上了一个自定义的属性,myAttr。

备忘模式,正式利用了这个方法,将已经运行过的结果存储起来,将函数接受到的参数作为key,将函数运行的结果作为value返回即可。代码如下

var myFunc = function (param) {
if(!myFunc.cache[param]){
var result = {};
     //...各种操作
myFunc.cache[param] = result;
}
return myFunc.cache[param];
}
myFunc.cache = {};

上面的写法,只适用于参数只有一个的情况,但实际情况中不会都是这样,因此可以考虑将参数转化为字符串,作为缓存对象里的key值,以哈希对象的形式保存

var myFunc = function () {
//arguments 是myFunc的参数列表,格式给{"1":arg1,"2":arg2}
var cacheKey = JSON.stringify(Array.prototype.slice.call(arguments)),
result;
if(!myFunc.cache[cacheKey]){
result = {};
myFunc.cache[cacheKey] = result;
}
return myFunc.cache[cacheKey];
}
myFunc.cache = {};

这种方式用在哪用合适呢?

举个例子,电商里商品要按照不同的条件进行排序,用户很可能多次切换排序,如果这里是用ajax实现的,那根据sort的方式不同,查询结果将被保存,当再次选择已经选择过的排序方式的时候,获得数据将不用再次调用接口,直接用缓存里获得。现在还没有看过jquery的源码,不过,jquery的ajax方法里的cache,很可能就是用类似的方法实现的吧。举一反三吧,睡觉!

Javascript备忘模式的更多相关文章

  1. 11. 星际争霸之php设计模式--备忘模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. javascript 备忘 细节 相关

    DOMContentLoaded事件触发时机,即dom tree完成但页面未必渲染完毕.   var a = [1,2,3,4]; var length = a.length; alert((leng ...

  3. Javascript备忘复习笔记2

    一.函数与形参 1.函数 function abs(x) { if (x >= 0) { return x; } else { return -x; } } alert(abs(-10)); 2 ...

  4. Javascript备忘

    js输出对象类型: Object.prototype.toString.apply(s) 设置单行点击效果: obj.style.background = "#efefef";se ...

  5. Javascript 备忘

    1遍历所有属性 var person={fname:"John",lname:"Doe",age:25}; for (x in person) { txt=tx ...

  6. Javascript备忘复习笔记1

    一.字符串操作 1.大小写 var s = "hello"; undefined g = s.toUpperCase(); "HELLO" g; "H ...

  7. 【读书笔记】读《JavaScript模式》 - JavaScript函数常用模式

    API模式:回调模式.配置对象.返回函数: 初始化模式:即时函数.即时对象初始化.初始化分支: 性能模式:备忘模式.自定义模式 //*********************** API模式 **** ...

  8. javascript优化--05模式(函数)

    回调函数模式: 基本例子: var findNodes = function (callback) { ...................... if (typeof callback !== ' ...

  9. javascript设计模式-迭代器模式(Iterator)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. ubuntu 下python版本切换

    1. 安装ubuuntu 14.04之后python的默认版本为2.7.6但是我想使用python的版本为3.4 可以打开终端:输入:alias python = python3

  2. ios 简单的倒计时验证码数秒过程实现

    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFireMethod:) ...

  3. Linux中cp覆盖不提示

    cp覆盖时,无论加什么参数-f之类的还是提示是否覆盖,这在大量cp覆盖操作的时候是不能忍受的. 1. 把a目录下的文件复制到b目录 cp –r a/* b 2. 执行上面的命令时,b存在的每个文件都会 ...

  4. 5分钟弄懂Docker--转载

    编者按:7月3日的“CSDN在线培训:Docker之道”,同时在线人数达到了历史新高,但是最后的QA环节,笔者发现大家的问题 还是很初级的,Docker技术还处在Gartner技术曲线的萌芽期.刚好前 ...

  5. C#获取IP地址

    public string GetUserIP()   {        string _userIP;       if(Request.ServerVariables["HTTP_VIA ...

  6. Redis List命令

        命令 解释 lpush key string 在key对应list的头部添加字符串元素,返回1表示成功,0表示key存在且不是list类型. rpush key string 同上,尾插入. ...

  7. qq邮箱邮我组件

    http://openmail.qq.com/cgi-bin/qm_help_mailme?sid=uvkgSu7e0aOrc0Qc&t=open_mailme 邮我 使用"邮我&q ...

  8. 生理周期[PKU1006]

    生理周期 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 132195   Accepted: 42171 Descripti ...

  9. BZOJ3425 : Poi2013 Polarization

    最小值肯定是把树看作二分图,此时答案为$n-1$. 最大值一定是选取重心为根,任意一个子树要么全部指向根,要么全部背离根,这样可以制造最大的星型图. 统计出每个子树的大小后做01背包,如果小于$\sq ...

  10. 51Nod 1256 乘法逆元 Label:exgcd

    1256 乘法逆元 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K ...