设计思想_函数式编程 - zen0822/interview GitHub Wiki

函数式编程

核心概念

函数是 “一等公民” (First-Class Functions)

这是函数式编程得以实现的前提,因为我们基本的操作都是在操作函数。这个特性意味着函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值,例如前面的

无状态和数据不可变 (Statelessness and Immutable data)

这是函数式编程的核心概念:

  • 数据不可变: 它要求你所有的数据都是不可变的,这意味着如果你想修改一个对象,那你应该创建一个新的对象用来修改,而不是修改已有的对象。
  • 无状态: 主要是强调对于一个函数,不管你何时运行,它都应该像第一次运行一样,给定相同的输入,给出相同的输出,完全不依赖外部状态的变化。

函数式编程关系

主要特性

没有副作用(No Side Effects)

副作用这个词我们可算听的不少,它的含义是:在完成函数主要功能之外完成的其他副要功能。在我们函数中最主要的功能当然是根据输入返回结果,而在函数中我们最常见的副作用就是随意操纵外部变量。由于 JS 中对象传递的是引用地址,哪怕我们用 const 关键词声明对象,它依旧是可以变的。而正是这个“漏洞”让我们有机会随意修改对象。

纯函数 (pure functions)

其实纯函数的概念很简单就是两点:

  • 不依赖外部状态(无状态): 函数的的运行结果不依赖全局变量,this 指针,IO 操作等。
  • 没有副作用(数据不变): 不修改全局变量,不修改入参。

所以纯函数才是真正意义上的 “函数”, 它意味着相同的输入,永远会得到相同的输出。