柯里化(Currying)是什么?
柯里化,听起来是不是很高级?其实它就是一种函数的高阶技术,不仅JavaScript里用得到,其他编程语言里也有它的身影。简单来说,柯里化就是将一个函数从可调用的
f(a, b, c)
转换为可调用的
f(a)(b)(c)
的过程。它不会直接调用函数,只是对函数进行转换。
举个例子,你就明白了
我们来创建一个辅助函数curry(f),它会对两个参数的函数f进行柯里化。比如,对于两个参数的函数f(a, b),执行curry(f)后,它就会变成以f(a)(b)形式运行的函数。
function curry(f) { // curry(f) 执行柯里化转换
return function(a) {
return function(b) {
return f(a, b);
}
}
}
用法也很简单,比如我们有一个求和函数sum(a, b),我们可以这样柯里化它:
function sum(a, b) {
return a + b;
}
let curriedSum = curry(sum);
alert( curriedSum(1)(2) ); // 输出 3
柯里化的高级用法
柯里化不仅可以简化函数调用,还可以实现更高级的功能。比如,lodash库的_.curry函数,它允许函数被正常调用或者以偏函数的方式调用。
function sum(a, b) {
return a + b;
}
let curriedSum = _.curry(sum);
alert( curriedSum(1, 2) ); // 输出 3
alert( curriedSum(1)(2) ); // 输出 3
柯里化的目的和好处
柯里化的主要目的是为了提高代码的可读性和可维护性。比如,我们有一个日志函数log(date, importance, message),通过柯里化,我们可以轻松地创建偏函数,比如用于生成今天的日志的偏函数。
function log(date, importance, message) {
alert(`[${date.getHours()}:${date.getMinutes()}] [${importance}] ${message}`);
}
log = _.curry(log);
let logNow = log(new Date());
logNow(