函数式编程 (笔记一)

160 阅读3分钟

函数式编程:一种"编程范式", 也可称为如何编写程序的方法论。主要思想:把运算过程尽量写成一系列嵌套的函数调用。

  • 随着 React 的广泛使用,函数式编程也开始被大家熟知。
  • 在使用 Vue3 的过程中,使用函数式编程更为简洁方便。
  • 进行函数式开发的库有: lodash、underscore、ramda...

优点

  • 在项目打包时可以更好的利用 tree sharking 过滤无用代码。
  • 函数式编程可以抛弃 this (?)。
  • 代码变得简洁,复用率增高。

Tree sharking : 一种通过消除最终文件中未使用的代码来优化体积的方法

相关定义

  • 思维方式:把现实世界的事物和事物之间的联系抽象到程序世界。
  • 本质:根据输入通过某种运算获得相应的输出。
  • 函数式编程用来描述 数据(函数)之间的映射

eg:x -> f(联系、映射) -> y,y=f(x)

特性

1. 函数是"一等公民"

"一等公民" 是指函数与其他数据类型一样,处于平等地位。可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。

var testFn = function (val) { console.log('fn', val); };
[1,2,3,4,5,6].forEach(testFn)  

2. 没有 " 副作用 "

副作用: 指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。

使用

1. 纯函数

checkAge (minAge, userAge) { 
  return userAge >= minAge
}

纯函数: 相同的输入始终要得到相同的输出,而且没有任何可观察的 副作用

副作用:如果函数依赖于外部的状态就无法保证输出相同,就会带来副作用。副作用也使得方法通用性下降,不适合扩展和可重用性。

  • 可缓存结果
    • 相同的输入值得到的结果始终相同。在多次调用同一纯函数时,相同的输入值仅在第一次时进行方法调用,之后则返回缓存结果。
  • 方便测试
  • 并行处理
    • 在多线程环境下并行操作共享的内存数据很可能会出现意外情况
    • 纯函数不需要访问共享的内存数据,所以在并行环境下可以任意运行纯函数 (Web Worker)

2. 高阶函数

在函数式编程中,如果函数能满足下面任一要求就可以被称为 高阶函数(higher-order function)

  • 接受至少一个函数作为参数
  • 返回的结果是一个函数

常用的高阶函数:forEach、map、filter、every、some、 find/findIndex、reduce、 sort

3.柯里化

柯里化: 当一个函数有多个参数的时候先传递一部分参数调用它(这部分参数以后永远不变),然后返回一个新的函数接收剩余的参数,返回结果。

checkAge (minAge) {
  return ((userAge) => {
    return userAge > minAge
  })
}
console.log(this.checkAge(18)(22))    // true

lodash 中的柯里化函数 : _.curry(func)