我们依旧从需求入手,只有知道我们要干嘛,才能一步步引导我们堆砌出万丈高楼。
先看下面的代码:
function add(x,y){
return x+y
}
console.log(add(3,1))//4
如果我们想这样执行add(3)(1)也能输出4,我们该怎么做.我们从这个函数调用可以知道,函数调用了两次,并且调用第一次后返回的是函数才能再调用,第一次调用传入了参数,第二次调用也传入了参数,并把两次传入的参数加起来了。因此我们有:
function add(x){
return function(y){
return x+y
}
}
console.log(add(3)(1))//4
延伸到我们另一个需求,我们假设let testNumber=regNumber(/\d+/),然后testNumber(‘123abd’),testNumber(‘abc’)来判断传入的参数是不是满足正则,明显真的能实现这样的函数的话,好处是,我们只要写一次正则判断,后面就不用写了,很方便。依据这个需求我们可以这样写:
function regNumber(reg,str){
return function (str){
return reg.test(str)
}
}
let testNumber=regNumber(/\d+/g)
console.log(testNumber('123abc'))//true
console.log(testNumber('abc'))//false
回到前面的add函数,如果我们想调用多少次就多少个相加呢,比如add(1)(2)(3)(4)…要达到1+2+3+…加到想要的效果我们应该怎么做呢,这明显是调用了一个函数之后又返回一个函数,因此我们可以定义一个函数返回自己,最后用toString隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回,代码如下:
function add() {
let args = [...arguments]
let _adder = function () {
args.push(...arguments)
return _adder
}
_adder.toString = function () {//利用隐式转换最后执行
return args.reduce(function (a, b) {
return a + b;
});
}
return _adder
}
console.log(add(1)(2)(3))//6
到这里我们好像都没有说过什么是柯里化,从上面我们可以看出,柯里化有调用的时候可以别的函数不一样,它是一个个的调用的,形容f(x)(y)(z)…这种。所以今后看到这样调用函数的相比是运用里柯里化,而函数内部可可想到一直return 回函数,最后一个return就是想要的结果。