前端进阶100集-(第二集)

300 阅读2分钟

函数式编程

当你的写的代码别人看着非常精简,但是又不会被一下子被看懂!说明你离大神差不远了。哈哈~~

   1 什么是函数式编程?

  函数式编程是指通过复合纯函数来构建软件的过程,它通过纯函数将应用状态流转,避免了共享的状态、易变的数据以及副作用。

嗯,这种解释觉得很深奥?没关系,往下看~

在了解之前,有必要了解一下ES6的简介

  1.function函数写法简写

    let func = function () {
        // do something...
    }

简写为:

    let func = () => {
        // do something...
    }

如果只有参数有返回值的情况:

    let func = (a, b) => {
        return 'something'
    }

如果只有一个参数有返回值的情况:

    let func = res => res + 1

如果有参数且返回函数的情况:

    let func = res => (() => {})

注意:最后一种情况将或多或少的和函数式编程有些关系:继续往下看:

    let func = function (a, b) {
        return a + b
    }

上例函数仅仅是对参数a, b做简单的相加并返回。但是却可以这样写:

    let func = function (a) {
        return function (b) {
            return a + b
        }
    }

加上e6写法后:

    let func = a => (b => a + b)

结论:上述写法将一个多参的函数转化为单参函数依次将结果传递出来,通过这种方式得到对参数有记忆过程的函数,说白了,可以理解为实现了对参数的"缓存"过程。这种现象有一个专业的叫法:函数柯里化。

但是:柯里化也有一个不好的问题,如果是很多个参数,一层嵌一层会比较麻烦,出现洋葱代码不是我们希望看到的。为了解决这种现象,我们需要-函数组合

  2.函数组合

    let mixn = (a, b) => (x => a(b(x)))

分析:上述代码通过mixn描述了一种关系:当参数a,b传进来且mixn执行后,返回一个依据a、b、x建立一种关系的函数。来个实例理解一下:

需求:想要建立一种关系,让一个函数执行时根据参数(函数)对数据进行处理

    let hander = mixn(res => res + 1, para => para * 2)
    hander(2)
    // 5

抽象写法:

    const com2 = (...arges) => (x => arges.reduceRight((x,b) => {return b(x)}, x))
    // 测试一下
    let func = (ele) => {
        return ele + 2
    }
    let compose = com2(func, func, func)
    compose(4);
    // 10

待续。。。