Skip to content

说说你对函数式编程的理解?优缺点?

函数式编程

shell
# 函数式编程是什么
函数式编程(Functional Programming,FP)是一种以函数为核心的编程范式
函数式编程核心是纯函数、不可变数据、函数是一等公民,强调 “描述结果” 而非 “步骤”,避免使用可变状态和循环,转而通过函数组合、递归等方式实现逻辑。

# 拓展:对比
命令式是 “手把手教计算机做事”,步骤清晰但代码冗余,适合简单 / 高性能场景;
声明式是 “告诉计算机要什么”,不关心步骤,代码简洁,是日常开发的主流
函数式是声明式的 “严格版”,以纯函数 / 不可变数据 / 函数一等公民为核心,无副作用、易测试,但学习成本高,适合复杂逻辑 / 异步场景。

# 拓展:纯函数、不可变数据、函数是一等公民
纯函数:输入相同则输出必相同,无副作用(不修改外部变量、不操作 DOM、不发请求等)。
不可变数据:数据一旦创建就不能修改,修改数据时返回新值(JS 中常用Object.freeze、扩展运算符...、map/filter等实现)。
函数是一等公民:函数可作为参数、返回值、赋值给变量(JS 天然支持,如回调函数、高阶函数)

优缺点

shell
# 优点:易测试、低副作用、代码简洁,适合复杂逻辑和异步场景;
易测试:纯函数无副作用、输入输出确定,无需模拟外部环境,直接传参测试即可(如测试add(2,3)只需验证结果为 5)。
代码更简洁、可读性更高:避免循环、临时变量,用map/filter/reduce等函数替代重复逻辑,逻辑更聚焦 “做什么” 而非 “怎么做”。
避免副作用,减少 Bug:不可变数据避免了多线程 / 异步场景下的 “竞态条件”(如多个地方同时修改一个数组),纯函数也不会意外修改外部变量,降低代码耦合度。
易于并行处理:纯函数不依赖共享状态,可安全地并行执行,适合大数据处理、多线程场景。

# 缺点:性能开销、学习成本高,JS 中建议混合范式使用,而非极端追求纯函数式。
性能开销:不可变数据每次修改都会创建新值(如扩展运算符...复制数组 / 对象),而非直接修改原数据,对于超大数组 / 对象,会增加内存占用和 GC 压力;
学习成本高:涉及纯函数、柯里化、组合、函子(Functor)等抽象概念,对习惯命令式编程的开发者不友好