我的回答
函数式编程中指导思想肯定是把函数摆在首位,也就是“函数是第一等公民”。
函数式编程关心数据的映射,命令式编程关心解决问题的步骤
参考回答
理解
- 函数式编程是一种编程范式,我们常见的编程范式有命令式编程、逻辑式编程,常见的面向对象编程也是一种命令式编程。
- 如果说如果说面向对象编程的思维方式: 把现实世界中的事物抽象成程序世界中的类和对象,通过封装、继承和多态来演示事物事件的联系,那么函数式编程的思维方式是: 把现实世界的事物和事物之间的联系抽象到程序世界(对运算过程进行抽象)。
- 函数编程中的函数,不是指计算机中的函数,而是指数学中的函数。也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。并且相同的值输入得到相同的结果,纯函数。
在函数式语言中,函数作为一等公民,可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合。简单的理解就是: 函数式编程用来描述数据(函数)直接的映射
优点
函数时编程的优点是由它的不可变性带来的,以下几点进行描述:
函数式编程可以抛弃this
- 打包过程中可以更好的利用tree shaking过滤无用代码
- 函数不依赖外部的状态,也不修改外部的状态,函数调用的结果不依赖函数调用的时间和调用的位置,这样的代码容易进行推理且不易出错,还可以把运行的结果进行缓存。同时,方便进行单元测试,方便进行处理
- 由于函数式语言是面向数学的抽象,更接近人的语言,而不是机器的语言,代码比较简洁,也更容易理解
风险
函数式编程的不可变性如果掺入可变性就带来了风险。如果一个纯函数掺入可变性就不再是纯函数啦,也就是如果函数依赖外部的状态接没有办法保证输出相同,就会带来副作用。
这个函数依赖外部的是num,如果num变成别的数字或者内容,那么的话相同的输入就变成不同的输出啦,这个副作用是不可避免的。一般副作用的来源:配置文件、数据库、获取用户的输入…const num=9;
function com(val){
return val===num
}
所有的外部交互都有可能带出副作用,副作用会给程序带来安全隐患,给程序带来不确定性,同时副作用不可能完全禁止,只能尽力控制它们在可控的范围内发生