最近在学习js的路上,遇到函数柯里化相关的内容,这里记录下自己的理解:
首先,什么是柯里化?
函数的柯里化,就是把一个接收多个参数的函数,转化成可以接收单一参数的函数。
举个简单的栗子:
// 一个接收两个参数的函数,实现加法
function add(a, b){
return a+b;
}
add(1,2);
// 转化成接收一个参数
function add(a){
return function(b){
return a + b;
}
}
var add2 = add(1);
add2(2);
在函数中返回另一个函数,从而实现分步调用参数。(这里利用了闭包,参数a被保留了)
但是这种写法的问题,1.如果新增参数个数,那么返回的函数也得增加,不灵活 2.代码不够优雅
所以我们可以写一个函数,来解决上面的这两个问题,这种功能就是柯里化。
// 实现函数柯里化
// 柯里化函数curry,传入初始的函数,返回柯里化后的函数
/**
@fn: 原始函数
@arg: 传入的参数,可选
**/
var curry = function(fn, ...args){
var length = fn.length; // 获取参数个数
var args = args || [];
return function(){
var newArgs = args.concat(Array.prototype.slice.call(arguments));
if(newArgs.length < length){
return curry.call(this, fn, ...newArgs);
}else{
return fn.apply(this, newArgs);
}
}
}
function add(a,b,c){
return a + b + c;
}
var curryAdd = curry(add, 1);
curryAdd(2)(3);
curry(add)(1)(2)(3)