函数式编程

437 阅读3分钟
/**
 * 函数式编程是非常古老的概念,早于第一台计算机的诞生 
 * 函数式编程(Functional Programming,FP)FP只是编程范式之一,我们常听说的编程范式还有面向过程编程,面向对象编程。
 * 
 * 面向过程编程的思维方式:按照步骤来实现,一步一步的实现我们想要的功能
 * 面向对象编程的思维方式:把现实世界中的事物抽象成程序世界中的类和对象,通过封装,继承和多态来演示事物之间的联系
 * 函数式编程的思维方式:把现实世界的事物和事物之间的联系抽象到程序世界(对运算过程进行抽象)
 * 
 * 函数式编程的本质:
 * 根据输入通过某种运算获得相应的输出,程序开发过程中会涉及很多输入和输出的函数
 * 函数式编程中的函数指的不是程序中的函数(方法),而是数学中的函数既映射关系,例如:y=sin(x),x和y的关系
 * 相同的输入始终会得到相同的输出(纯函数)
 * 函数式编程用来描述数据(函数)之间的映射
 * 
 * 为什么要学习函数式编程:
 * 函数式编程是随着react的流行受到越来越多的关注 react中的高阶组件使用了高阶函数来实现,高阶函数是函数式编程的一个特性,react并不是纯函数式的
 * vue3开始拥抱函数式编程
 * 函数式编程可以抛弃this
 * 打包过程中可以更好的利用tree shaking过滤无用代码
 * 方便测试,方便并行处理
 * 有很多库可以帮助我们进行函数式开发:lodash、underscore、ramda
 */

/**
 * 纯函数和不纯的函数
 * slice() /splice
 */

let array = [1, 2, 3, 4, 5]

//纯函数(相同的输入得到相同的输出)
console.log(array.slice(0, 3)) //输出:[ 1, 2, 3 ]
console.log(array.slice(0, 3)) //输出:[ 1, 2, 3 ]
console.log(array.slice(0, 3)) //输出:[ 1, 2, 3 ]

//不纯的函数 (改变了原来的数组,相同的输入没有得到相同的输出)
console.log(array.splice(0, 3)) //输出:[ 1, 2, 3 ]
console.log(array.splice(0, 3)) //输出:[ 4,5 ]
console.log(array.splice(0, 3)) //输出:[ ]

//纯函数
function add(a, b) {
    return a + b
}

//函数式编程一定要有输出和输出,而且相同的输入永远得到相同输出
console.log(add(1, 2)) //输出:3
console.log(add(1, 2)) //输出:3
console.log(add(1, 2)) //输出:3

/**
 * slice: 返回数组中的指定部分,不会改变原数组
 * splice:对数组进行操作返回该数组,会改变原数组
 *
 * 纯函数:
 * 1:相同的输入永远会得到相同的输出,并且没有任何可观察的副作用。
 * 2:纯函数就类似数学中的函数(用来描述输入和输出的关系),y=f(x)
 *
 * 函数式编程不会保留计算中间的结果,所以变量是不可变的(无状态的)
 * 可以把一个函数的执行结果交给另外一个函数去处理
 * 函数式编程可以无数次的重用,函数式编程的过程中抽象出来的函数是细粒度的函数,这些函数将来可以组合成更强大的函数
 */