讲师中心 微信公众号
AI工具推荐 视频效率加速

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

冬枫君_7226

冬枫君_7226

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

|

165人浏览过

|

来源于php中文网

原创

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

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

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

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

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

  • 确定性:相同参数调用,返回值必须严格一致。比如 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 却是“好榜样”?

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

Json Repair Kit
Json Repair Kit

使用 Node.js 评估修复格式错误的 JSON,自动纠正尾随逗号、单引号、未加引号的键等常见问题,实现文件规范化。

下载
  • 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;
}

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

相关文章

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

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

下载

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

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

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

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

1138

2023.09.04

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

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

4745

2025.09.18

python 全局变量
python 全局变量

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

1990

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

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

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

630

2025.09.05

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

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

343

2025.11.16

golang map原理
golang map原理

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

533

2025.11.17

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

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

303

2025.11.27

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

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

精品课程

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

共58课时 | 12.3万人学习

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

共12课时 | 1.4万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn