javascript函数式编程

什么是函数式编程?

数学中的函数
f(x) = y
  • 函数必须总是接受一个参数
  • 函数必须总是返回一个值
  • 函数应该依据接收到的参数而不是外部环境运行
  • 对于一个给定的x,只会输出唯一的一个y
var percentValue = 5;
var calculateTex = (value) => {
    return value/100 * (100 + percentValue ))
}

上面的计税函数不是一个纯函数在于它依赖了全局变量percentValue ,修复方法很简单,只需要移动全局变量percentValue ,把它作为函数的参数改写如下:

var calculateTex = (value, percentValue ) => {
return value/100 * (100 + percentValue )
}

现在calculateTex 可以被称为一个真正的纯函数了。
将函数对全局变量的依赖移到函数的参数中是最常见的一种“纯函数化”的方式,移除函数对全局变量的访问会使得函数的测试更加容易。

引用透明性 (Referential Transparency)

函数对于相同的输入都将返回相同的值,这一属性被称为引用透明性。依据函数的这一属性可以直接用函数的结果替换掉函数的调用,这个过程被称为替换模型,这些特性使得并发代码和缓存称为可能。多线程和同步的问题在于对全局数据的依赖上,而遵循引用透明性的函数只依赖参数的输入而不依赖全局数据,所以线程可以自由的运行且没有锁的机制。
引用透明性是一种分析哲学

函数式编程与命令式编程的对比

命令式编程遍历数组
let array = [1,2,3]
for (let i = 0; i< array.length; i++) {
console.log(array[i])
}
函数式编程
let array = [1,2,3]
array.forEach(item => console.log(item))

在函数式编程中我们移除了“如何做”的部分将他抽象到一个函数中(高阶函数),如此可以让开发者只需要关心手头的问题

纯函数

  • 纯函数不应该依赖任何外部变量,同时也不应该改变任何外部变量。
  • 纯函数应该像Math.max(3,4,5,6)一样,不需要看max的内部实现就能得到结果。
  • 纯函数允许我们并发的执行代码,因为纯函数不会改变它的环境,意味着我们不需要关心同步的问题。
  • 纯函数使缓存函数的输出避免下次重新计算成为可能
  • 纯函数应该被设计成只做一件事(单一职责)就像UNIX哲学那样,我们可以通过组合或者管道来完成复杂的任务