什么是纯函数?

菜园前端
• 阅读 374

原文链接:https://note.noxussj.top/?source=helloworld


什么是纯函数?

相同的输入永远会得到相同的输出,而且没有任何可观察的副作用。纯函数就类似数学中的函数(用来描述输入和输出之间的关系)y=fn(x)

纯函数库

我们平时用的 lodash 其实就是纯函数库。

纯函数的优点

  1. 可缓存(直接提升性能)

也就是我们平常说的函数缓存,因为纯函数对相同的输入始终有相同的结果,所以可以把纯函数的结果缓存起来,就没必要每次调用该函数都要重新执行一遍函数体的代码

  1. 可测试

纯函数让测试更方便,不受副作用的影响

  1. 并行处理

在多线程环境下并行操作共享的内存数据很可能会出现意外情况(纯函数内的数据都是独立的),纯函数不需要访问共享的内存数据,所以在并行环境下可以任意运行纯函数

基础案例

纯函数

相同的输入始终得到相同的输出

const array = [1, 2, 3, 4, 5]

console.log(array.slice(0, 3))
console.log(array.slice(0, 3))
console.log(array.slice(0, 3))

// [ 1, 2, 3 ]
// [ 1, 2, 3 ]
// [ 1, 2, 3 ]

不纯的函数

相同的输入得到的输出却不相同

const array = [1, 2, 3, 4, 5]

console.log(array.splice(0, 3))
console.log(array.splice(0, 3))
console.log(array.splice(0, 3))

// [ 1, 2, 3 ]
// [ 4, 5 ]
// []

函数缓存

每次调用函数,并且传入参数相同时,函数体内代码不会被执行,直接返回上一次输出的结果

const lodash = require('lodash')

function getArea(r) {
    console.log(r)
    return Math.PI * r * r
}

let getAreaWithMemory = lodash.memoize(getArea) // 创建一个缓存函数

console.log(getAreaWithMemory(4))
console.log(getAreaWithMemory(4))
console.log(getAreaWithMemory(4))
console.log(getAreaWithMemory(5))

// 4
// 50.26548245743669
// 50.26548245743669
// 50.26548245743669
// 5
// 78.53981633974483
点赞
收藏
评论区
推荐文章
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
单元格自动计算
在我们填报报表时,有的单元格的数据是需要通过自动计算直接获得,但是不是所有的函数都支持填报自动计算,这是为什么呢?报表是纯java的,其函数是后台程序,是在服务器中完成计算的。而填报中的自动计算是在客户端完成的,这个怎么实现呢?实际上是做了一个函数转换,把后台java函数转换成了适合前端计算的js函数。也就是说能够进行填报自动计算的函数有两套代码,java代
Souleigh ✨ Souleigh ✨
3年前
React Hooks 快速上手
ReactHook快速上手一、Hook简介1.1Hook历史在ReactHook出现之前的版本中,组件主要分为两种:函数式组件和类组件。其中,函数式组件通常只考虑负责UI的渲染,没有自身的状态也没有业务逻辑代码,是一个纯函数。而类组件则不同,类组件有自己的内部
菜园前端 菜园前端
1年前
什么是函数式编程?
原文链接:什么是函数式编程?函数式编程(FunctionalProgramming,FP)就是利用纯函数实现细粒度的函数,然后再通过函数的组合把细粒度的函数组合成功能更强大的函数。函数式编程中的"函数"不是程序中的函数(方法),而是数学中的函数(映射关系)
Stella981 Stella981
3年前
Boost Python官方样例(三)
导出C类(纯虚函数和虚函数)大致做法就是为class写一个warp,通过get\_override方法检测虚函数是否被重载了,如果被重载了调用重载函数,否则调用自身实现,最后导出的时候直接导出warp类,但是类名使用class,析构函数不需要导出,因为它会被自动调用纯虚函数编写C函
Stella981 Stella981
3年前
PyQt5 控件学习(一个一个学习之QTextEdit)
QTextEdit描述:前面,我们学的是QLineEdit,它是纯文本单行输入,这里要看的是QTextEdit它是纯文本多行输入。!(https://oscimg.oschina.net/oscnet/765c47e82f9bb27d493fe975bf10e49c7c7.png)它支持的是html4的部
Wesley13 Wesley13
3年前
初探 Objective
作者:Cyandev,iOS和MacOS开发者,目前就职于字节跳动0x00前言异常处理是许多高级语言都具有的特性,它可以直接中断当前函数并将控制权转交给能够处理异常的函数。不同语言在异常处理的实现上各不相同,本文主要来分析一下ObjectiveC和C这两个语言。为什么要把ObjectiveC和
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
菜园前端 菜园前端
1年前
前端同学都了解什么是副作用么?
原文链接:什么是副作用?副作用会让一个函数变的不纯,纯函数是根据相同的输入返回相同的输出,如果函数依赖于外部的状态就无法保证输出相同,就会带来副作用。副作用来源函数依赖外部状态(变量),但是副作用不可能完全禁止,尽可能控制在它们可控范围内发生。缺点副作用使
基于Effect的组件设计 | 京东云技术团队
Effect的概念起源从输入输出的角度理解Effect编程中的Effect起源于函数式编程中纯函数的概念纯函数是指在相同的输入下,总是产生相同的输出,并且没有任何副作用(sideeffect)的函数。副作用是指函数执行过程中对函数外部环境进行的可观察的改变