JavaScript—-什么是纯函数

JavaScript—-什么是纯函数定义简单来说,一个函数的返回结果只依赖于它的参数,并且在执行过程里面没有副作用,我们就把这个函数叫做纯函数。这么说肯定比较抽象,我们把它掰开来看:函数的返回结果只依赖于它的参数。函数执行过程里面没有副作用。consta=1constfoo=(b)=>a+bfoo(2)//=>3foo函数不是一个纯函数,因为它返回的结果依赖于外部变量…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

定义

简单来说,一个函数的返回结果只依赖于它的参数,并且在执行过程里面没有副作用,我们就把这个函数叫做纯函数。这么说肯定比较抽象,我们把它掰开来看:

  • 函数的返回结果只依赖于它的参数。
  • 函数执行过程里面没有副作用。
const a = 1
const foo = (b) => a + b
foo(2) // => 3

Jetbrains全家桶1年46,售后保障稳定

foo 函数不是一个纯函数,因为它返回的结果依赖于外部变量 a,我们在不知道 a 的值的情况下,并不能保证 foo(2) 的返回值是 3。虽然 foo 函数的代码实现并没有变化,传入的参数也没有变化,但它的返回值却是不可预料的,现在 foo(2) 是 3,可能过了一会就是 4 了,因为 a 可能发生了变化变成了 2。

const a = 1
const foo = (x, b) => x + b
foo(1, 2) // => 3

现在 foo 的返回结果只依赖于它的参数 x 和 b,foo(1, 2) 永远是 3。今天是 3,明天也是 3,在服务器跑是 3,在客户端跑也 3,不管你外部发生了什么变化,foo(1, 2) 永远是 3。只要 foo 代码不改变,你传入的参数是确定的,那么 foo(1, 2) 的值永远是可预料的。

这就是纯函数的第一个条件:一个函数的返回结果只依赖于它的参数。

函数执行过程没有副作用
一个函数执行过程对产生了外部可观察的变化那么就说这个函数是有副作用的。

我们修改一下 foo:

const a = 1
const foo = (obj, b) => {
  return obj.x + b
}
const counter = { x: 1 }
foo(counter, 2) // => 3
counter.x // => 1

我们把原来的 x 换成了 obj,我现在可以往里面传一个对象进行计算,计算的过程里面并不会对传入的对象进行修改,计算前后的 counter 不会发生任何变化,计算前是 1,计算后也是 1,它现在是纯的。但是我再稍微修改一下它:

const a = 1
const foo = (obj, b) => {
  obj.x = 2
  return obj.x + b
}
const counter = { x: 1 }
foo(counter, 2) // => 4
counter.x // => 2

现在情况发生了变化,我在 foo 内部加了一句 obj.x = 2,计算前 counter.x 是 1,但是计算以后 counter.x 是 2。foo 函数的执行对外部的 counter 产生了影响,它产生了副作用,因为它修改了外部传进来的对象,现在它是不纯的。

但是你在函数内部构建的变量,然后进行数据的修改不是副作用:

const foo = (b) => {
  const obj = { x: 1 }
  obj.x = 2
  return obj.x + b
}

虽然 foo 函数内部修改了 obj,但是 obj 是内部变量,外部程序根本观察不到,修改 obj 并不会产生外部可观察的变化,这个函数是没有副作用的,因此它是一个纯函数。

除了修改外部的变量,一个函数在执行过程中还有很多方式产生外部可观察的变化,比如说调用 DOM API 修改页面,或者你发送了 Ajax 请求,还有调用 window.reload 刷新浏览器,甚至是 console.log 往控制台打印数据也是副作用。

纯函数很严格,也就是说你几乎除了计算数据以外什么都不能干,计算的时候还不能依赖除了函数参数以外的数据。

总结

一个函数的返回结果只依赖于它的参数,并且在执行过程里面没有副作用,我们就把这个函数叫做纯函数。

为什么要煞费苦心地构建纯函数?因为纯函数非常“靠谱”,执行一个纯函数你不用担心它会干什么坏事,它不会产生不可预料的行为,也不会对外部产生影响。不管何时何地,你给它什么它就会乖乖地吐出什么。如果你的应用程序大多数函数都是由纯函数组成,那么你的程序测试、调试起来会非常方便。


作者:胡子大哈
原文链接: http://huziketang.com/books/react/lesson32

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203659.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea如何隐藏自动生成的*.iml、.idea文件[通俗易懂]

    idea如何隐藏自动生成的*.iml、.idea文件[通俗易懂]idea怎么隐藏创建项目时会自动生成的*.iml和.idea。点击File–>setting(或者Ctrl+Alt+S)–>Editor–> Flie Types 在ignore files and folders,然后在输入框最后面跟上    .idea;*.iml;然后Apply–>OK 即可。最后项目的样子。…

    2022年6月13日
    92
  • web浏览器缓存机制_网站利用浏览器缓存

    web浏览器缓存机制_网站利用浏览器缓存浏览器缓存机制之一(经典缓存)因为在接手的项目中用到过比较新的HTML5应用缓存,也用到了经典的缓存如设置max-age,Etag之类,而之前一直就是在用着没有去深究其中原理。周末天气不好,懒得出去了,正好找时间总结下。1.关于浏览器缓存记得去年看《HTTP权威指南》的时候,有一章是专门讲浏览器缓存的,一年时间过得太快,逝去的时光还真是如同人群中消失的好姑娘,眼看她嫁给别人。我这里把浏览器缓存分为…

    2022年10月21日
    1
  • dell服务器如何恢复掉线硬盘阵列

    dell服务器如何恢复掉线硬盘阵列如果一个RAID5中有两块硬盘掉线,理论上来说,这个RAID阵列彻底失效,数据全部丢失,无法恢复。此时,如果数据非常重要,建议寻求专业的数据恢复公司帮助。如果想要自己尝试,此时有很小的几率可以修复。进入RAID卡配置界面后,选择objects-logical drive–对象,逻辑驱动器看到两块硬盘的状态都是failed–失败,如下:如果知道哪块硬盘是后掉线的,就将这个

    2022年6月26日
    270
  • WinForm和WPF的区别「建议收藏」

    一、控件的差异作为Windows桌面UI开发的两大.net开发库,WinForm和WPF同时存在着。之所以功能如此重合的两个库同时存在,是因为两者的底层差异非常大,WinForm底层依赖于传统的Win32API,特别是User32.dll;而WPF则底层依赖于Direct3D。而我们知道User32和Direct3D两者是平行存在,彼此独立的。WPF之前几乎所有的WindowsUI开发都依赖于User32,当然游戏除外。随着Direct3D的日趋成熟和显卡的普通性能提升,微软力图改变这种状况,所以开发

    2022年4月12日
    55
  • Idea激活码最新教程2021.3.2版本,永久有效激活码,亲测可用,记得收藏

    Idea激活码最新教程2021.3.2版本,永久有效激活码,亲测可用,记得收藏Idea 激活码教程永久有效 2021 3 2 激活码教程 Windows 版永久激活 持续更新 Idea 激活码 2021 3 2 成功激活

    2025年5月21日
    3
  • PHP如何添加内置的扩展

    PHP如何添加内置的扩展

    2022年1月3日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号