我的回答

函数式编程中指导思想肯定是把函数摆在首位,也就是“函数是第一等公民”。

函数式编程关心数据的映射,命令式编程关心解决问题的步骤

参考回答

理解

  • 函数式编程是一种编程范式,我们常见的编程范式有命令式编程、逻辑式编程,常见的面向对象编程也是一种命令式编程。
  • 如果说如果说面向对象编程的思维方式: 把现实世界中的事物抽象成程序世界中的类和对象,通过封装、继承和多态来演示事物事件的联系,那么函数式编程的思维方式是: 把现实世界的事物和事物之间的联系抽象到程序世界(对运算过程进行抽象)。
  • 函数编程中的函数,不是指计算机中的函数,而是指数学中的函数。也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。并且相同的值输入得到相同的结果,纯函数。
  • 在函数式语言中,函数作为一等公民,可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合。简单的理解就是: 函数式编程用来描述数据(函数)直接的映射

    优点

    函数时编程的优点是由它的不可变性带来的,以下几点进行描述:

  • 函数式编程可以抛弃this

  • 打包过程中可以更好的利用tree shaking过滤无用代码
  • 函数不依赖外部的状态,也不修改外部的状态,函数调用的结果不依赖函数调用的时间和调用的位置,这样的代码容易进行推理且不易出错,还可以把运行的结果进行缓存。同时,方便进行单元测试,方便进行处理
  • 由于函数式语言是面向数学的抽象,更接近人的语言,而不是机器的语言,代码比较简洁,也更容易理解

    风险

    函数式编程的不可变性如果掺入可变性就带来了风险。如果一个纯函数掺入可变性就不再是纯函数啦,也就是如果函数依赖外部的状态接没有办法保证输出相同,就会带来副作用。
    1. const num=9;
    2. function com(val){
    3. return val===num
    4. }
    这个函数依赖外部的是num,如果num变成别的数字或者内容,那么的话相同的输入就变成不同的输出啦,这个副作用是不可避免的。一般副作用的来源:配置文件、数据库、获取用户的输入…

所有的外部交互都有可能带出副作用,副作用会给程序带来安全隐患,给程序带来不确定性,同时副作用不可能完全禁止,只能尽力控制它们在可控的范围内发生