函数柯里化,其实就是高阶函数的一个应用。
什么是高阶函数呢,就是将一个函数A作为另一个函数B的参数, B就是一个高阶函数。
所谓"柯里化",就是把一个多参数的函数,转化为单参数函数。
柯里化是指这样一个函数(假设叫做createCurry),他接收函数A作为参数,运行后能够返回一个新的函数。并且这个新的函数能够处理函数A的剩余参数。
**
举个例子:
const add = (x, y) => x + y;
add(1, 2) //3
👆上诉代码就很简单的一个求和计算值。
如果用柯里化函数思想我们可以写成这样👇
首先我们得有个接受两个参数的通用柯里化函数:
const curry = (binaryFn) => {
return function (firstArg) {
return function (secondArg) {
return binaryFn (firstArg, secondArg) ; // 为啥要嵌套那么多呢?基于什么思路呢?思考一下...
};
};
};
然后把add函数转化成一个柯里化的版本
const add = (x, y) => x + y;
const autoCurriedAdd = curry(add);
autoCurriedAdd(1)(2) // 3
通过比较,柯里化函数明显把简单问题复杂化了,这个时候为啥还要用呢?
当然这只是其中的一个场景而已! 如果场景很多呢,然后都是接受两个参数,那么这个模板的作用就起来了。
比如说我们有个函数const mul = (x, y) => x * y
;
如果我们柯里化一下
const autoCurriedAdd = curry(mul);
autoCurriedAdd(1)(2) // 2
![image.png](https://upload-images.jianshu.io/upload_images/18026767-7b416e9e9071d8d7.png&originHeight=284&originWidth=773&size=19017&status=done&style=none&width=773?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
当然上诉展示的只是两个参数的柯里化模板,三个参数可以依葫芦画瓢,如下:
const curry = (binaryFn) => {
return function (firstArg) {
return function (secondArg) {
return function (thirdArg) {
return binaryFn (firstArg, secondArg, thirdArg) ; // 为啥要嵌套那么多呢?基于什么思路呢?思考一下...
};
};
};
};
那么参数越来越多呢,那可咋整?
这个时候递归就出来了!!!
// 柯里化函数
const curry = (fn) => {
if (typeof fn !== 'function') {
throw Error('No function provided')
}
return function curriedFn (...args) {
if (fn.length > args.length) { // 未达到触发条件,继续收集参数
return function () {
return curriedFn.apply(null, args.concat([].slice.call(arguments)))
}
}
return fn.apply(null, args)
}
}
这样我们就可以接受多个参数了。
const multiply = (x, y, z, t) => x * y * z * t;
const curryMul = curry(multiply);
const result = curryMul(1)(2)(3)(4); // 1*2*3*4 = 24
![image.png](https://upload-images.jianshu.io/upload_images/18026767-1546efb2429c26de.png&originHeight=369&originWidth=674&size=24695&status=done&style=none&width=674?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
image.png
这就很棒了,剩下的自己拓展吧!!!