首先看看柯里化到底是什么?
维基百科上说道:把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
什么情况下会用到函数柯里化?
1、我们不方便传入参数时,例如:
//回调
function a(b){ }
Promise.resolve().then(a(b));
如上所写,在then里面直接调用a方法的话,那么给then里面的就不是一个函数了,但是then里面是要给一个函数的。如果要达到这个效果的话,就要运用柯里化,如下所示:
Promise.resolve().then(a.bind(this,123));
2、我们写了一个方法,但是这个方法很多时候调用起来参数是固定的,例如:
fuction inputTest(reg, value){ } //验证表单的函数
假设有10个表单需要验证是否纯数字,每一次都需要输入验证规则和值,10个表单就要调用10次。对于验证是否纯数字来说,函数的第一个参数验证规则(reg)都是一样的,没必要输入10次,所以这里就需要柯里化,具体做法如下:
const numberTest = inputTest.bind(this, /^[0-9]*$/);
numberTest(123);
柯里化怎么实现
function aCurry(num1){
return function(num2){
console.log(num1,num2)
}
}
function a(num1, num2){
}
aCurry(1)(2)
柯里化函数会接收到固定参数,然后再柯里化函数里面,返回一个新的函数,接收剩余参数。
手写实现一个bind函数
Function.prototype.mybind = function(thisArg){
if(typeof this !== "function"){
return;
}
var _self = this;
// args 获取第一个方法内的全部参数
var args = Array.prototype.slice.call(arguments,1);
return function(){
// 将后面方法里的全部参数和args进行合并
var newArgs = args.concat(Array.prototype.slice.call(arguments));
return _self.apply(thisArg, newArgs);//调用原方法本身
}
}
总结
函数的柯里化,返回的是一个函数的函数。其实现方式,需要依赖参数以及递归,通过拆分参数的方式,来调用一个多参数的函数方法,以达到减少代码冗余,增加可读性的目的。