javascript如何进行函数式编程_纯函数和副作用如何管理【教程】

梦杰吖_7051

梦杰吖_7051

2026-01-19

866人浏览

原创

纯函数需满足:相同输入必得相同输出,且不依赖或修改任何外部状态;所有输入须显式传参,禁用Date.now()、Math.random()等非确定性操作,副作用须显式封装隔离。

javascript如何进行函数式编程_纯函数和副作用如何管理【教程】

纯函数怎么写才真正“纯”

纯函数必须满足两个条件:相同输入永远返回相同输出,且不修改外部状态。很多人以为只要没用 return 就不是纯函数,其实关键在「是否依赖或修改闭包/全局变量」。

常见错误是把对象属性读取当纯操作,比如:

const user = { name: 'Alice', score: 100 };
const getScore = () => user.score; // ❌ 依赖外部可变对象

正确做法是显式传入不可变数据:

  • 所有输入必须作为参数传入,包括配置、时间戳、随机数种子等
  • 返回值只能基于参数计算,不能调用 Date.now()、Math.random()、localStorage.getItem()
  • 避免解构赋值时意外修改原对象(如用 { ...obj } 浅拷贝不够时,深层嵌套仍可能被改)

副作用必须显式分离和封装

HTTP 请求、DOM 操作、定时器、日志打印这些都属于副作用。函数式编程不禁止副作用,而是要求它们不混在计算逻辑里,且能被识别、测试、替换。

典型做法是用「作用类型」或「IO 包装器」延迟执行,例如:

const IO = (fn) => ({ map: (f) => IO(() => f(fn())), run: () => fn() });
const log = (msg) => IO(() => console.log(msg));
const fetchUser = (id) => IO(() => fetch(`/api/users/${id}`));

这样 log 和 fetchUser 本身不触发副作用,只描述“将要做什么”,真正执行由 .run() 控制。

JavaScript 测试模式
JavaScript 测试模式

使用 Jest、Vitest 和 Testing Library 实施全面的测试策略,包括单元测试、集成测试和端到端测试,涵盖模拟、测试夹具和测试驱动开发。在编

下载
  • 不要在纯函数内部调用 console.log 或 document.querySelector
  • 异步操作统一用 Promise 或 Observable 表达,而非直接 fetch().then(...)
  • 调试时可用 tap 工具函数(如 RxJS 的 tap),但确保它不改变数据流值

如何用现有 JS 生态做函数式实践

不用重写整个项目也能渐进式引入函数式思维。重点不是用多少高阶函数,而是守住「数据不可变」和「逻辑可预测」这两条线。

推荐从这几个点切入:

  • 用 Object.freeze() 或 immer 的 produce 替代直接修改对象
  • 数组操作优先用 map、filter、reduce,避免 for 循环 + push/splice
  • 用 lodash/fp 或 ramda 的自动柯里化函数(如 R.prop('name')),减少匿名函数嵌套
  • 状态管理中,把 reducer 写成纯函数,副作用(如 API 调用)交给中间件(如 Redux Thunk / RTK Query)

容易被忽略的“隐性副作用”

最常踩坑的是那些看起来无害、实则破坏纯性的操作:

const formatDate = (date) => date.toLocaleString(); // ❌ 依赖当前 locale 和时区

这类函数在单元测试里可能通过,上线后因用户系统设置不同而行为不一致。

  • JSON.stringify() 对 undefined、函数、Symbol 的处理会丢失数据,不是纯映射
  • new Date() 每次调用返回不同实例,哪怕只读取 .getTime() 也违反纯性
  • 正则表达式字面量 /abc/g 有内部状态(.lastIndex),多次 .exec() 会改变结果
  • 使用 Array.prototype.sort() 必须传比较函数,否则默认转字符串排序,且会原地修改数组

真正的难点不在写出一个纯函数,而在整条调用链上没有一处偷偷读了外部变量、改了共享引用、或依赖了当前环境状态。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

2024.05.11

729

5

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

2025.12.18

664

18

ThinkPHP中间件机制与请求拦截处理实践
ThinkPHP中间件机制与请求拦截处理实践

本专题围绕 ThinkPHP 中间件体系展开,深入讲解中间件的定义、注册与执行流程。内容包括全局中间件与路由中间件的区别、请求前后处理逻辑、自定义中间件开发以及权限验证与日志处理应用。通过实际案例,帮助开发者掌握中间件在项目中的核心作用与最佳实践。

2026.03.31

458

17

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2355

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3862

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1276

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

4479

7

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

5016

8

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

2023.07.05

3461

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习