高阶函数
函数柯里化(闭包暂存思路)
一个函数多次调用传入不同的参数,统一所有参数计算出结果
本质上原理就是缓存住函数的参数
- 利用函数返回函数,来拼接暂存住参数集合
- 加上参数数量的判断条件决定是执行目标函数,还是继续返回包装的未执行函数
js
// 柯里化函数
const curry = (fn) => {
return function curriedFn (...args) {
// 未达到触发条件(目标函数所需要的参数数量),继续收集参数,不执行目标函数
if (fn.length > args.length) {
return function () {
// slice方法内部的this就会被替换成arguments,并循环遍历arguments,复制到新数组返回,这样就得到了一个复制arguments类数组的数组对象。
return curriedFn(...args, ...arguments)
}
}
return fn(...args)
}
}
const multiply = (x, y, z) => x*y*z; // multiply.length -> 3
const curryMul = curry(multiply);
const result = curryMul(1)(2)(3); // 1*2*3 = 6
👆 函数.length === arguments.length
用于判断累积的参数数量是否满足要求
函数组合
一系列逻辑函数,在平时的操作是,自己写一个处理函数,来调用多个函数 👇
js
const fn1 = ()=>{}
const fn2 = ()=>{}
const fn3 = ()=>{}
const fn = (params) {
const res1 = fn1(params)
const res2 = fn2(res1)
const res3 = fn3(res2)
return res3
}
fn(params)
这个处理函数同样可以作为复用函数使用
用函数组合,则是抽离处理多个函数的逻辑为一个纯函数,不需要自己写处理函数
把多个函数,拼接成一个函数,调用时传入参数,会经过多个函数
js
const fn1 = ()=>{}
const fn2 = ()=>{}
const fn3 = ()=>{}
const fn = compose(fn1,fn2,fn3)
fn(params)
👆 函数组合,其实编写的代码上区别不大。。。但是确实省了很多自己写处理函数的繁琐
实现组合工具方法compose(把值传递遍历执行思路)
实际上,当我们真正的按照函数式编程的思维,写着一个一个的原子函数,想要调用的时候往往会出现这样的写法
js
function fn() {
return 'fn1'
}
function deal(info) {
return info
}
// 把info数据处理一次后,传给fn
const res = fn(deal(info))
js
// 组合多个函数 compose
function compose(...fns){
return (value) => {
// 倒序执行
return fns.reverse().reduce((lastRes, fn) => fn(lastRes), value);
}
}
const composefn = compose(fn1, fn2);
composefn('I am value');