函数的柯里化

291 阅读1分钟

什么是函数的柯里化

柯里化(Currying)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。

16年面试遇到一个面试题

sum(1)(2)(3)//需要输出7  当时看到这个瞬间懵逼

function sum(a){
    return (b)=>{
        return (c)=>{
            return a+b*c
        }
    }
}
sum(1)(2)(3)

实际上可以直接传三个参数返回就行如下:

function sum (a,b,c){
    return a+b*c
}
sum(1,2,3)

那么问题来了 为什么费这么大劲封装这么多层,有什么用呢?

举一个例子吧: 判断一个变量的类型。

 //常见的判断类型的方法 typeof instanceof constructor Object.prototype.toString.call()等等。。
 function checkType1(content,type){
     return Object.prototype.toString.call(content) === `[object ${type}]`
     //反引号(`)可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。
 }
 let isString1=checkType1('aa','String')
 console.log(isString1)
 //以上方法每次判断类型的时候都需要把type传上参数不可以达到复用
 //让我们来看看使用currying的好处
 
function checkType2(type){
     return (content)=>{
         return Object.prototype.toString.call(content) === `[object ${type}]`
     }
 }
 let isString2=checkType2('String');
 let test=isString2('aaa')
 let test1=isString2('qqq')
console.log(test)
//这样的话参数就可以达到复用

最后扩充一道经典的面试题

//实现一个add方法,使计算结果能满足如下预期
add(1)(2)(3)=6
add(1,2,3)(4)=10
add(1)(2)(3)(4)(5)=15
//大家可以先想想