编程范式——函数式编程| 青训营笔记

94 阅读2分钟

函数式编程

函数的特点
  • 函数是"一等公民"
  • 纯函数/无副作用
  • 高阶函数跟闭包

总的来说函数式编程就是对运算的过程抽象

函数式编程中的函数指的数学中的函数即映射关系,输入的值对应一个输出的值,例如 y = f(x)

相同的输入始终得到相同的输出(纯函数)

函数式编程用来描述数据(函数)之间的映射

优势
  1. 可缓存
  2. 可移植
  3. 可测试
  4. 可推理
  5. 可并行
函数——头部函数
  • 函数可以存储在变量中
  • 函数作为参数
  • 函数可以作为返回值

函数作为一个普通的对象,可以赋值于变量也能当作返回值

const fn = function () { console.log('this is a function') }

作为返回值

const BlogController = {
  index(posts) {
    return Views.index(posts)
  },
  show(post) {
    return Views.show(post)
  },
  create(attrs) {
    return Db.create(attrs)
  },
  update(post, attrs) {
    return Db.update(post, attrs)
  },
  destroy(post) {
    return Db.destroy(post)
  }
}
纯函数

纯函数: 对于相同的输入永远会得到相同的输出,而且没有任何可观察的副作用

// 不纯的函数
const mini = 18

function checkAge(age) {
  return age >= mini
}

// 纯函数
function checkAge(age) {
  const mini = 18
  return age >= mini
}

但是对于纯函数来说,不用直接修改函数外的代码,这样来说更加方便维护

闭包

闭包:函数和其周围的状态(词法环境)的引用捆绑在一起形成闭包。

其实就是内部的函数在堆上依然可以引用外部,可以联想一下离散数学闭包的概念。闭包是R+是包括R的

柯里化(Haskell Brooks Curry)

就是把多个参数先传一部分然后再返回新的函数来接受剩余的参数,和函数式编程的概念密切相关。 这种其实是一种函数闭包

// 普通纯函数
function checkAge(min, age) {
  return age >= min
}

// 柯里化,函数闭包
function checkAge(min) {
  return function (age) {
    return age >= min
  }
}

柯里化相当于把一些参数固定逐渐缩小变量个数,是一种对参数的暂时的保存,可以让函数粒度更小

组合函数

组合函数就是将函数变成参数组合

image.png