js函数柯里化

最近在学习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)

js函数柯里化_第1张图片

 

你可能感兴趣的:(js)