简单封装一个柯里化函数调用函数

代码如下:

  最近在研究函数式编程,然后正好复习许久没有使用过的函数柯里化了,就简单封装了一个柯里化函数,注释很完善就不多解释了

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
       
       function curry(fn){
           //去掉curry第一个参数 该参数是后续参数传递结束的一个函数
           //并且转换为一个数组
            let args = [].slice.call(arguments,1);
            //获取需要柯里化执行函数的形参参数个数
            let len = fn.length;
            //定义变量获得传入参数个数
            let newLen = args.length;
            //参数未传递结束继续返回函数就行传参
            function __curry(){
                //保持除调用函数外所有参数
                 args.push(...arguments)
                //参数不够时保存每次传参个数
                newLen+=arguments.length;
                //判断参数是否和需要调用函数的参数保持一致
                if(newLen === len){
                    //保持一致就传入所有参数调用该函数
                    return fn.apply(this,args);
                }
                //否则返回函数继续传参
                return __curry;   
            }
            //判断是否一次性传完参数如果传完参数则传入参数调用需要调用的函数
            if(args.length === len){
                return fn.apply(this,[...args]);
            }
            //一次性参数传多了返回提升字符串
            if(args.length > len){
                return "参数传多了";
            }
            //返回__curry函数
            return __curry;
       }

       //使用柯里化调用 的函数
       function add(a,b,c,d){
           return a+b+c+d;
       }
       //测试
       console.log(curry(add,1,2,3,4));//输出 10
       console.log(curry(add,1,2,3)(4));//输出 10
       console.log(curry(add,1,2)(3)(4));//输出 10
       console.log(curry(add,1)(3)(4)(2));//输出 10
       console.log(curry(add)(3)(4)(2)(1));//输出 10
       console.log(curry(add)(3)(4)(2)(1));//输出 10
       console.log(curry(add,1,2,3,4,5));//输出 参数传多了
    </script>
</body>
</html>

这样一个柯里化函数调用函数就完成了!

原文地址:https://www.cnblogs.com/y-y-y-y/p/10584941.html