在JS中实践函数式编程【2】 -- 基本概念

377 阅读5分钟

写在文章前

咸鱼了很久,终于失踪人口回归。今天的函数式编程是函数式系列的第二弹。在了解真正如何实现函数式编程之前我们还是先了解一些专业词汇方便后续的理解。

文章如果有什么不对的地方欢迎在评论区批评指正。

函数

函数式编程,函数式编程,最基本的构成自然是函数。比起其他普通的函数,我们其实是更关注数学上的功能。

函数如果从数学的理论上是一个给定输入产生输出的一个"东西"。但是在函数式编程中要求,在给定输入的时候,有且只有唯一输出. 这就意味着如果我们在传参相同的情况下,我们希望,函数能够实现相同的功能,返回相同的值。 这听起来好像很容易的亚子,但这就硬性的要求了。

  • 函数只能依赖输入参数
  • 返回值只返回单一的值。
  • 返回值是确定性的,不能使用随机值。

这种一心只爱一个人的函数被叫做纯函数。

像极了优秀男人的纯函数

我们来举几个不是纯函数的🌰。

🌰1 :

function number(num) {
    return Math.random() % 2 === 0 ? 'even' : 'odd';
}

上面这个函数就不纯,因为在给定传参的情况下,他不会有确定的返回值返回。它违反了确定性的原则。

再举个🌰:

let a = 'aaa';
function joinAandB(b){
    return `${a} ${b}`
};

这个函数也不是纯函数,因为他依赖了一个函数外的变量,这会导致返回值的结果会在外部依赖更改的情况下,也会更改。我们没法确定他总是返回相同的值。

再举个🌰

function calculateAdd(a, b) {
    return a + b;
}

上面的这个加法计算函数就是纯函数,他不会依赖其他外部变量,在给定传参的时候,他有唯一的返回值。

总得来说,函数纯不纯不看溶质占溶液的百分比,而看他的功能性是不是确定的,他是不是自力更生的,他是不是从一而终的。这个纯函数就是函数中的好男人,遇到这种好男人,当然选择爱他。

为啥有这样的要求?

为什么要这样严格的限定输入输出?自由民主的空气不好吗🐶?

其实严格的限定还是有好处的:

  1. 可读性高
  2. 出错方便定位
  3. 更容易测试

因为函数的功能是保持单一的,所以我们只需要看函数体就知道这个函数式做什么的。而且因为没有外部依赖,我们会更容易的定位到出错原因。听起来很美好,但是其实我们可以预想到要真的做到完全的纯函数是不可能。这个原因我们之后在分析,在此之前,我们首先先了解一下两个概念: 一阶函数和高阶函数。

头等函数

其实头等函数并不是在真正的业务代码中总被使用的函数,但在某些情况下我们还是有必要使用头等函数的。

那到底什么是头等函数?头等函数就是当一个编程语言的函数可以像任何其他的变量时,我们就认为该语言拥有头等函数。头等函数可以被传递,可以被赋值,可以存储任何复杂的数据结构比如对象或者数组。总而言之就是头等函数堪比一些值类型,他变了,变得不像个函数了。

js中的函数是头等函数,这也就解释了为什么函数的种种使用都很像对象。

function calculator = {
    add,
    multiple,
    decrease,
    devide
};
function add (a,b){
    return a + b;
}

但我们肯定会有个疑问,为什么函数要有这样的形式。不管其他的官方理由,反正在函数式编程中,这是为了实现另一种函数形式: 高阶函数。

高阶函数

对于可以更改其他函数的函数就是高阶函数,我们会使用其他函数作为参数,或者我们会将函数作为返回值。

其实javascript中就已经实践很多高阶函数,比如,sort函数,比如map函数,filter,foreach等所有传入函数的函数都是高阶函数。js中那些内置的高阶函数都限定了返回值必须是函数,因为他们就是用来操作函数的。

function produceName(firstname){
    return function addLastName(lastname) {
        return `${lastname} ${firstname}`
    }
}

const firstname = produceName('alice');
const name = firstname('Smith');

我们知道了如何将函数作为参数进行传入,那上面的例子就说明了如何将函数作为返回值返回。高阶函数就是操作函数的函数,也是函数式编程的精华所在。

总结

说白了函数式编程就是将许多复杂的功能,拆分成具有原子性,可确定性,以及不依赖其他模块的一些"微函数"。所以最后将这些函数组合的时候,就是频繁使用高阶函数的时候。

【PS】公司依旧还在招聘,需要内推的小伙伴欢迎私戳。