函数柯里化(curry)

我们依旧从需求入手,只有知道我们要干嘛,才能一步步引导我们堆砌出万丈高楼。
先看下面的代码:

  		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就是想要的结果。

猜你喜欢

转载自blog.csdn.net/weixin_44494811/article/details/113791898