什么是函数式编程

函数式编程是一种编程范式,常见的编程范式有函数式编程命令式编程
命令式编程是面向计算机硬件的抽象,有变量,赋值语句,表达式和控制语句,其实就是一个指令序列。
函数式编程是面向数学的抽象,将计算描述为一种表达式求值,感觉就是函数式程序就是一个表达式。

本质

函数式编程中的函数这个术语不是指计算机中的函数,而是指数学中的函数,即自变量的映射。也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。比如sqrt(x)函数计算x的平方根,只要x不变,不论什么时候调用,调用几次,值都是不变的。
举个例子:

[(5+2)-3]*2

传统的过程式变成会这样写:

const a = 5+2;
const b = a-3;
const c = b*2;

那我们的函数式编程应该怎么写呢:

function add(a,b){
   return a+b;
}
function subtract(a,b){
   return a-b;
}
function multiply(a,b){
   return a*b;
}
let  result = multiply(subtract(add(5,2),3),2);

特点

  • 函数是"第一等公民"
    指的是函数可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合。
  • 只用"表达式",不用"语句"
    "表达式"(expression)是一个单纯的运算过程,总是有返回值;"语句"(statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。
  • 没有"副作用"
    所谓"副作用",指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。
    函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。
  • 不修改状态
    函数式编程只是返回新的值,不修改系统变量。
  • 引用透明
    引用透明,指的是函数的运行不依赖于外部变量或"状态",只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的。

好处

  • 方便代码管理
    函数既不依赖外部的状态也不修改外部的状态,函数调用的结果不依赖调用的时间和位置,这样写的代码容易进行推理,不容易出错。这使得单元测试和调试都更容易。
  • 易于“并发”
    由于(多个线程之间)不共享状态,不会造成资源争用(Race condition),也就不需要用锁来保护可变状态,也就不会出现死锁,这样可以更好地并发起来,尤其是在对称多处理器(SMP)架构下能够更好地利用多个处理器(核)提供的并行处理能力。
  • 代码简洁易于理解
    由于函数式语言是面向数学的抽象,更接近人的语言,而不是机器语言,代码会比较简洁,也更容易被理解。

你可能感兴趣的:(什么是函数式编程)