从curry化实现谈一些js中方法的实现
curry 化的实现
一般的场景是这个样子, 必然有一个函数可以接受多个参数, 但是我们可以分多次调用传入
比如 function sum(a, b, c) {return a+b+c}
调用时候实现方式如 curryingSum(1)(2)(3) 也可以实现调用,
需要提供一个 currying 函数, 将传入的方法进行处理.
核心使用原则是 递归 和 方法的长度属性. 不断将调用的参数传入, 并记录参数长度
recurs 和 fn.length
1 | const currying = (fn, ...arg1) => (...arg2) => |
总结与思考
- 其中的 arg1, arg2 的顺序为什么这么去写
- 即, 形如
c(1)(2)(3)我的实际调用顺序是 1=>2=>3 还是 3=>2=>1 呢, 又比如我增加括号((c(1))(2))(3)会有什么变化么? - 通过
fn.length去做属性判断, 那是否不定参数的就有问题了呢?
回答:
前两个问题可以归结为调用顺序, 按照 js 优先级, 调用的顺序是从左到右依次进行的, 所以增加括号是一个含义,
先执行 c(1) 发现返回是一个函数, 才可以继续执行 c(1)(2), 以后依次进行.
所以我们的调用顺序与声明顺序就是一致的.
比如以下测试函数
1 | const sequence = a=>(console.log(a), b=>(console.log(b), c=>{console.log(c)})); |
第三个问题, 既然是不定参数, 此问题似乎也失去了意义, 原来的方法首先就支持不定参数的处理了.
后记
重新回顾此问题, 是因为 redux 中到处 curry 的应用. 比如 middleare 的定义
1 | const aMiddleware = store=>next=>action=>{ |