https://www.jianshu.com/p/5e1899fe7d6b
接收函数作为参数的函数,都可以叫做高阶函数。柯里化其实就是高阶函数的一种特殊用法。
柯里化是指这样一个函数(假设叫做createCurry),他接收函数A作为参数,运行后能够返回一个新的函数。并且这个新的函数能够处理函数A的剩余参数。
用下面的例子解释:
有一个接收三个参数的函数A。
function A(a, b, c) {
// do something
}
假如,我们有一个已经封装好了的柯里化通用函数createCurry。他接收参数,能够将A转化为柯里化函数,返回结果就是这个被转化之后的函数。
var _A = createCurry(A);
那么_A作为createCurry运行的返回函数,他能够处理A的剩余参数。因此下面的运行结果都是等价的。
_A(1, 2, 3);
_A(1, 2)(3);
_A(1)(2, 3);
_A(1)(2)(3);
A(1, 2, 3);
函数A被createCurry转化之后得到柯里化函数_A,_A能够处理A的所有剩余参数。因此柯里化也被称为部分求值。
例如有一个简单的加法函数,他能够将自身的三个参数加起来并返回计算结果。
function add(a, b, c) {
return a + b + c;
}
那么add函数的柯里化函数_add则可以如下:
function _add(a) {
return function(b) {
return function(c) {
return a + b + c;
}
}
}
下面的运算方式是等价的。
add(1, 2, 3);
_add(1)(2)(3);
当然,靠眼力封装的柯里化函数自由度偏低。
首先通过_add可以看出,柯里化函数的运行过程其实是一个参数的收集过程,我们将每一次传入的参数收集起来,并在最里层里面处理。(通过闭包的原理实现)