zoukankan      html  css  js  c++  java
  • 柯里化函数之Javascript

    柯里化函数之Javascript

    定义

    依据定义来说,柯里化就是将一个接收“多个”參数的函数拆分成一个或者很多个接收“单一”參数的函数。定义看起来是比較抽象的。以下来举个样例:

    代码

    1
    2
    3
    4
    5
    function concat(str1,str2){
    return str1 + str2;
    }
    concat("forever","px") // "foreverpx"

    不难理解。上面的代码中定义了一个连接字符串的函数,返回连接两个传入參数的字符串。

    如今我们再看看还有一种定义方式:

    1
    2
    3
    4
    5
    6
    7
    8
    function concatCurry(str1){
    return function(str2){
    return str1 + str2;
    }
    }
    var concatOne = concatCurry("forever");
    concatOne("px"); //foreverpx

    上面的代码中。我们将一開始传入两个參数的函数改装成了一个(或者说是两个)仅仅接收一个參数的函数。

    我们来创建一个将接受多个參数的函数柯里化的通用函数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    function curry(fn) {
    var args = [].slice.call(arguments, 1);
    return function() {
    return fn.apply(null, args.concat([].slice.call(arguments, 0)));
    }
    }
    var concatOne = curry(concat,"forever");
    concatOne("px"); //foreverpx

    柯里化的过程利用了闭包,使得返回的函数也能获得第一次传入的參数。


    首先将传入的第二个參数存入args变量中,然后返回一个函数,在返回的函数中,将第一次传入的參数与柯里化之后传入的參数拼接起来成一个数组,然后通过apply方法调用柯里化之前的函数(fn),这样就达到了柯里化的效果。

    假设是三个參数的函数想要柯里化,则例如以下:

    1
    2
    3
    4
    5
    6
    7
    8
    function concat(s1,s2,s3){
    return s1+s2+s3;
    }
    var cur1 = curry(concat,"forever");
    var cur2 = curry(cur1,"px");
    cur2("-me"); //foreverpx-me

    文章作者:foreverpx
    文章原文链接:柯里化函数之Javascript

  • 相关阅读:
    剑指 Offer 05. 替换空格
    28. 实现 strStr()
    67. 二进制求和
    排序算法之二快速排序
    排序算法之一冒泡排序
    将本地文件上传到GitHub
    spring data jpa 操作pipelinedb 的continuous view 与stream
    pipelinedb学习笔记
    PostgreSQL 、springboot 、spring data jpa 集成
    pipelineDB学习笔记-2. Stream (流)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5200796.html
Copyright © 2011-2022 走看看