学习underscore之函数缓存

什么是函数缓存?

函数缓存就是将函数运算过的结果缓存起来,当下次调用时,如果遇到相同的参数,就直接返回缓存中的数据。这种做法是典型的使用内存换取性能的手段,常用于缓存数据计算结果和缓存对象。

underscore1.11.0 中实现方式:

function memoize(func, hasher) {
    var memoize = function(key) {
        var cache = memoize.cache;
        var address = '' + (hasher ? hasher.apply(this, arguments) : key);
        if (!has(cache, address)) cache[address] = func.apply(this, arguments);
        return cache[address];
    }
    memoize.cache = {};
    return memoize;
}

代码中,underscore默认使用function的第一个参数作为key,直接使用的话是有问题的:

var add = function (a, b, c) {
    return a + b + c
}

var memoizeAdd = memoize(add);
memoizeAdd(1, 2, 3);   // 6
memoizeAdd(1, 2, 4);   // 6

所以如果需要支持多参数,我们就需要传入hasher函数,自定义存储的key值,例如我们可以使用JSON.stringify:

var memoizeAdd = memoize(add, function () {
    var args = Array.prototype.slice.call(arguments);
    return JSON.stringify(args);
});
memoizeAdd(1, 2, 3);   // 6
memoizeAdd(1, 2, 4);   // 7

vue源码中函数缓存方法:

function cached (fn) {
    var cache = Object.create(null);
    return (function cachedFn (str) {
        var hit = cache[str];
        return hit || (cache[str] = fn(str))
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值