0

0

javascript函数式编程是什么_纯函数与副作用如何理解?

夜晨

夜晨

发布时间:2025-12-31 20:11:02

|

145人浏览过

|

来源于php中文网

原创

纯函数需同时满足输入完全决定输出且无副作用;如pureadd是纯函数,impureinc因修改外部状态而非纯;slice不改原数组是纯的,splice等会修改原数组属副作用;副作用须显式隔离、集中管控并可测试。

javascript函数式编程是什么_纯函数与副作用如何理解?

JavaScript 函数式编程不是加个 mapfilter 就算数,它的核心是用「纯函数」组织逻辑、把「副作用」明确隔离出来——否则只是披着函数外衣的过程式代码。

怎么一眼识别纯函数?两个硬指标必须同时满足

判断一个函数是不是纯函数,只看两件事:输入是否完全决定输出?执行过程有没有“碰”外部世界?

  • 确定性:相同参数调用,返回值必须严格一致。比如 Math.pow(2, 3) 永远是 8,不依赖时间、随机数、全局变量或配置项
  • 无副作用:不能修改传入的引用类型(如 arr.push())、不能改全局变量、不能操作 document、不能发请求、不能 console.log(哪怕只是调试)
function pureAdd(a, b) {
  return a + b; // ✅ 纯:只靠参数,不碰外界
}

let count = 0;
function impureInc() {
  return ++count; // ❌ 非纯:依赖并修改外部状态
}

为什么 splice 是“坏同学”,slice 却是“好榜样”?

数组方法是最容易踩坑的日常场景。关键看它是否「改变原数组」——这属于典型的副作用。

动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版
动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版

动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包

下载
  • slice(start, end) 返回新数组,原数组不变 → 符合纯函数精神(只要不传入 mutable 对象作为参数本身)
  • splice(start, deleteCount, ...items) 直接修改原数组 → 副作用立现,哪怕你没用返回值
  • 同理:sort()reverse()fill() 全部非纯;而 map()filter()flatMap() 默认纯(前提是回调函数也纯)
const nums = [1, 2, 3];
nums.slice(0, 2); // [1, 2] → nums 还是 [1, 2, 3]
nums.splice(0, 2); // [1, 2] → nums 变成 [3]!副作用已发生

副作用不是敌人,但必须“显式声明”和“集中管控”

完全没副作用的程序等于没用——你要渲染页面、要存 localStorage、要发请求。问题不在“有没有”,而在“谁负责、在哪发生、能否测试”。

立即学习Java免费学习笔记(深入)”;

  • 把副作用从计算逻辑中抽离,变成可替换的参数:比如把 Email.send(user) 改成 sendEmail(EmailService, user)
  • 在框架层统一收口:React 的 useEffect、RxJS 的 subscribe、Redux-Saga 的 call,都是为副作用提供可控的“出口”
  • 测试时直接 mock 副作用:传一个假的 fetch 函数进去,断言它是否被正确调用,而不用真连网络
// ❌ 副作用藏在深处,无法测试
function signUp(name) {
  const user = db.save({ name });
  email.send(user); // 调用真实邮件服务
  return user;
}

// ✅ 副作用外移,逻辑可测
function signUp(db, email, name) {
  const user = db.save({ name });
  email.send(user);
  return user;
}

最容易被忽略的一点:**对象和数组作为参数传入时,函数内部对它们属性或元素的修改,就算副作用**——哪怕没动变量名本身。纯函数要求“不碰传入的引用”,只读或深拷贝后再操作。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

409

2023.09.04

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

93

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

106

2025.09.18

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

77

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

40

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

47

2025.11.27

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

420

2023.08.08

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.9万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号