美文网首页函数编程
函数编程-js-v1.0.0

函数编程-js-v1.0.0

作者: 一点金光 | 来源:发表于2019-07-27 22:35 被阅读0次

    摘要:函数式编程中函数有三种不同的解读方式,分别为纯函数、高阶函数和一等函数。
    关键词纯函数一等函数高等函数闭包
    目录
    纯函数
    正文

    纯函数
    什么是它
    1、相同的输入必定产生相同的输出
    2、在计算的过程中不会产生副作用

    一等函数

    对基本元素的使用方式进行限制,带有最少限制的元素被称为一等公民:
    可以使用变量命名;
    可以使用函数作参;
    可以以函数作返回;
    可以在数据结构中;

    const square = x => x * x
    

    高阶函数

    使用函数作为输入参数,或者返回结果为函数的函数,被称为高阶函数。

    闭包

    何为闭包
    闭包是由函数及该函数捕获的其上下文中的自由变量组成的记录。

    function add(x) {
      const xIn = x;
      return function addInner(y) {
        return xIn + y;
      }
    }
    const inc = add(1);
    inc(8); //=> 9;
    
    const plus2 = add(2);
    plus2(8); //=> 10;
    

    上述代码中返回的函数 addInner 及由其捕获的在其上下文中定义的自由变量 xIn,便组成了一个闭包
    上述代码中最外层的 add 函数是一个高阶函数,其返回值为一等函数 addInner
    其实 add 函数的参数 x也是 addInner 上下文的一部分,所以 'xIn'也就没有存在的必要了,add代码优化如下:

    function add(x) {
      return function addInner(y) {
        return x + y;
      }
    }
    

    借助于箭头函数,我们可以进一步优化 add的实现:

    const add = x => y => x + y
    

    闭包应用
    闭包主要用来做数据缓存,而数据缓存应用非常广泛:包括函数工厂模式、模拟拥有私有变量的对象、函数缓存、还有大名鼎鼎的函柯里化。
    上述代码中 add函数便是柯里化形式的函数。
    上述代码中的 const inc = add(1);const plus2 = add(2);是一种函数工厂模式,通过向 add函数传入不同的参数,产生了功能不同的函数。
    例如我们有一个如下形式的 Ajax 请求函数:

    const ajax = method => type => query => { ... };
    
    const get = ajax('GET');
    const post = ajax('POST');
    
    const getJson = get('json');
    const getHtml = ajax('GET')('text/html') = get('text/html');
    

    我们抽象出了最一般的ajax请求函数,在具体应用时,我们能通过函数工厂生产出作用不同的函数。——函数工厂

    const memoize = pureFunc => {
      const cache = {};
      return function() {
        const argStr = JSON.stringify(arguments);
        cache[argStr] = cache[argStr] || pureFunc.apply(pureFunc, arguments);
        return cache[argStr];
      };
    };
    

    memoize的功能是对传入函数pureFunc 进行缓存,返回缓存版本的 pureFunc。当我们使用参数调用缓存的函数时,缓存的函数会到 cache 中查找该参数是否被缓存过,如果有缓存,则不需要再次计算,直接返回已缓存值,否则对本次输入的参数进行计算,缓存计算的结果以备后用,然后将结果返回。——函数缓存

    参考文献

    https://zhuanlan.zhihu.com/p/31834974?group_id=922511685466832896

    相关文章

      网友评论

        本文标题:函数编程-js-v1.0.0

        本文链接:https://www.haomeiwen.com/subject/pcwyyftx.html