原 Curry的js实现

柯里化是函数式变成的基础之一,js写函数式常用的工具之一,此处试着实现一个 柯里化函数工具

var curry=function(f){
    var fun=""
    var len= f.length  //参数长度
    var args=[]        //参数保存用于延迟执行的时候添加参数
    return fun= function (){                //延迟执行函数
            for(var i=0;i<arguments.length;i++){
                if(len==args.length){         //参数长度达成  开始执行函数
                    args=[]
                    return   f.apply(null,args)
                }  else{
                    args.push(arguments[i]);   //push参数进入参数保存列表
                    if(len==args.length){      //每次push都要检查是否达成条件  出发执行函数动作
                        args=[];
                        return   f.apply(null,args)
                    }
                }
            }
            return fun
    }
}

函数组合用于将多个函数组合成一个函数,流式的处理数据

var compose = function() {
    var args=arguments;     //获取所有函数
    return function(x) {
        var result=null;
        for(var i=args.length;i>0;i--){ //反转函数
            if(i==args.length){
                result=  args[i-1].call(null,x)
            }else{
                result=  args[i-1].call(null,result)
            }
        }
        return result;
    };
};

测试:

var gg=1234;
function  Sum(a,b,c,d,e,f,g,h,j){
    return gg+a+b+c+d+e+f+g+h+j;
}

var xxx=curry(Sum);
console.log(xxx(1));      //[Function]
console.log(xxx(2));      //[Function]
console.log(xxx(4,5,6));  //[Function]
console.log(xxx(7,8,9));  //[Function]
console.log(xxx(10));     //52

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android Note

Kotlin —  Destructuring Declarations(解构声明)

1252
来自专栏青青天空树

2017-统计字符个数

输入:输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。

1091
来自专栏大数据钻研

JAVA基础

一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。 下面简要介绍下类、对象、方法和实例变量的概念。 对象:对象是类的一个实例,...

2827
来自专栏海天一树

小朋友学Python(3):布尔类型

本节讲解C/C++/Java/Python中的布尔类型。 一、C语言 C语言中没有布尔类型,判断时 ,0为假,非0为真。 二、C++ C++的bool是布尔类型...

28911
来自专栏大闲人柴毛毛

三分钟理解“模板方法模式”——设计模式轻松掌握

模板方法模式的官方定义: 在模板方法模式中,只定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定...

35910
来自专栏Python小屋

详解Python对象属性

在面向对象编程中,公开的数据成员可以在外部随意访问和修改,很难控制用户修改时新数据的合法性。解决这一问题的常用方法是定义私有数据成员,然后设计公开的成员方法来提...

3148
来自专栏Hongten

J2SE 断言 [Assert]

/**  * 断言 [Assert]  *  从jdk1.4版本开始,java语言中引入了断言 [Assert]  *  机制,允许java开发者在代码中加入一...

851
来自专栏海天一树

小朋友学Java(5):静态方法

先编写程序: class Demo { public void fun1() { System.out.println("Hello")...

2866
来自专栏王硕

原 memmove 和 memcpy的区别

1513
来自专栏林德熙的博客

C# const 和 readonly 有什么区别

在写常量的时候,是选择使用 const 还是 static readonly 是一个让人难以决定的问题,本文告诉大家这两个方法的区别。

1002

扫码关注云+社区

领取腾讯云代金券