首先,什么是柯里化,什么时候会用到柯里化。
柯里化(Currying),又称部分求值(Partial Evaluation),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
很难懂吧,其实白话就是:通过柯里化处理的函数,可以分别传参。例如,test(a,b,c)通过柯里化处理后,可以这样调用:test(a)(b)(c),test(a,b)(c),test(a)(b,c).....
那么什么场景业务会用到柯里化呢?
例如:我们写一个计算商品打折后价格的函数:
after(scale,price){
return price*scale
}复制代码
如果我们知道了其中一个参数是一般情况下不会变化的,例如打折折扣scale。如果使用了柯里化函数我们就可以在不改变打折函数的情况下获得一个计算固定折扣的函数。通过这个函数就可以只填写价格就得到价格。
let after_half_fold = curry(afer,0.5)
复制代码
那么,如果实现一个柯里化函数呢?
首先要知道实现这个函数的核心思想:通过递归函数不断的获取参数,直到获取的参跟传入函数的参数值相等,再通过apply执行原函数。
柯里函数网上有许多大神的实现。但为了方便大家更容易看懂,我手写了一个简陋版的柯里函数,简单易懂。核心思想以及实现方式不变。
let test = function(a, b, c) { console.log("a:", a, "b:", b, "c:", c);};let curry = function(fun, arg, length) { arg = [arg] || []; length = length || fun.length; return function(...rest) { if (rest.length >= length - arg.length) { fun.apply(this, arg.concat(rest)); } else { curry.apply(this, [fun, arg.concat(rest), length]); } };};let curry_t = curry(test, "aaa");curry_t("bbb", "ccc");
复制代码
注释就不写了,已经凌晨两点了。明天还要上班,就这样吧。反正也没人看。