缓存函数,柯里化函数,偏函数

579 阅读1分钟

缓存函数

把函数和对应的结果放到一个对象中,调用时,判断参数对应的数据是否存在,存在的话就返回对应的结果数据。

不使用缓存函数的斐波那契数列

let count = 0;
let fb = (n) => {
  count++;
  return n < 2 ? n : fb(n-1) + fb(n-2);
}

for(let i = 0; i<= 10; i++) {
  fb(i)
}
console.log('--------------count------------------', count)  
// 453次

使用缓存函数的斐波那契数列

let count = 0;
let fb = (n) => {
  count++;
  return n < 2 ? n : fb(n-1) + fb(n-2);
}

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

fb = memoize(fb);

for(let i = 0; i<= 10; i++) {
  fb(i)
}

console.log('--------------count------------------', count)
// 12

箭头函数没有arguments

柯里化函数

本人理解就是把一个多个参数的函数,拆分成和函数参数等量的函数,下面举例。

function person(name, age, single) {
    return `${name},${age},${single}`
}

现在把这个函数改成柯里化函数

function person(name) {
 return function pAge(age) {
   return function pSingle(single) {
     return `${name},${age},${single}`
   }
 }
}
let res = person('芳芳')(25)('是')

可以看到柯里化函数,就是把n个参数的函数,链式调用了n次,这种方式可以提交代码的复用率。实际开发中,大多使用loadsh插件

偏函数

将有n个参数的函数变成一个n-x的函数

let add = (x,y) => x + y;
let rst = add.bind(null, 1);
rst(2)  // 3