缓存函数
把函数和对应的结果放到一个对象中,调用时,判断参数对应的数据是否存在,存在的话就返回对应的结果数据。
不使用缓存函数的斐波那契数列
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