我在读这个代码的时候,还是花了一些时间的;但是彻底弄明白以后,发现核心思想其实很简单,只是ramda做了很多容错、占位符等处理,多了一些参数,看起来就不太容易理解。
这个函数是用来给函数消元的(柯里化),比如 最简单的一个拼接字符串的例子
_curryN函数接收3个参数
length {Number} -- 参数个数(待消元个数)
received {Array} -- 参数数组
fn{Function} -- 最终执行函数
先把辅助部分抛开,只看关键部分,应该是这样的
这样就很容易理解了,这个函数干2件事情
1.判断length个参数,是否已经全部传入,是则执行方法,否则继续柯里化
2.将已接收到的参数和当前新参数合并成新的参数数组
详细解释一下
该函数将已接收到的参数放入combined数组中,combinedIdx表示已放入的个数,如果combinedIdx === received.length 表示已经将之前的参数都添加到了新数组,在判断当前新参数,如果argsIdx === arguments.length表示已经将新的参数也放入了数组中。至此combined得到了一个包含当前最新所有参数的数组,再判断left(已消元的次数) === 0 如果是,执行最终方法,传入参数 否则 继续递归调用_curryN
(看来自己想清楚到说清楚还是需要锻炼,总觉得自己没解释清楚。。)
其他的一些,就是ramdajs的一些辅助功能了,比如判断参数是否是占位符 _isPlaceholder,
还有_arity 不太清楚意义何在。
如果上面的核心思想我解释清楚的话,这些辅助功能自己一看就明白了。
掌握核心思想之后,稍加思考,就能得出一个更加'函数式'的函数
网友评论