前言

纯函数这个这个词我相信小伙伴们多多少少都听说过,它是函数式编程的基础。本文主要是对纯函数进行探讨,包括基本概念,优点,运用的经典案例以及我们日常该如何去合理的使用等等。

纯函数的概念

首先我们来看看纯函数的基本概念:

相同的输入,总是会的到相同的输出,并且在执行过程中没有任何副作用。

该怎么去理解上面的概念呢?我们要把上面这句话拆成两部分来看。

相同的输入,总是会得到相同的输出

来看看下面的例子:

let a = 1;function xAdd(x) {return x + a;
};
xAdd(1); //2

上面这个函数就不是一个纯函数,因为在我们程序执行的过程中,变量a很可能会发生改变,当变量a发生改变时,我们同样执行xAdd(1)时得到的输出也就不同了。

再看另一个例子:

function sum(x, y) {return x + y;
};
sum(1,2); //3

在这个例子中,符合相同的输入得到相同的输出这个概念,sum是一个纯函数。

执行过程中没有任何副作用

这里我们要搞清楚什么是副作用,这里的副作用指的是函数在执行过程中产生了外部可观察变化

  1. 发起HTTP请求
  2. 操作DOM
  3. 修改外部数据
  4. console.log()打印数据
  5. 调用Date.now()或者Math.random()

上面一系列操作都可以被称为是副作用。下面可以接着看一个修改外部数据从而产生副作用的例子:

let a = 1;
function func() {a = 'b';
};
func();
console.log(a); // b

我们运行了func函数,外部的变量a的值发生了改变,这就是产生了所谓的副作用,所以func不是一个纯函数。当我们这样进行修改:

function func2() {let a = 1;a = 'a';return a
};
func(); // a

函数fun2不会对产生外部可观察变化,也就不会产生副作用,它就是一个纯函数。

一个纯函数,上面所说的两个条件缺一不可。

纯函数的好处

通过了解纯函数的概念,我相信有的小伙伴已经能感觉到纯函数的一些的好处了:

  • 更容易进行测试,结果只依赖输入,测试时可以确保输出稳定
  • 更容易维护和重构,我们可以写出质量更高的代码
  • 更容易调用,我们不用担心函数会有什么副作用
  • 结果可以缓存,因为相同的输入总是会得到相同的输出

纯函数运用的经典案例

既然纯函数有这么多好处,那么我们来看看有哪些运用纯函数的经典案例。

数组的基本方法

数组的很多基本方法都是纯函数,例如map,forEach,filter,reduce等等。

redux中的reducer

Redux中三大原则之一使用纯函数来执行修改,其中就运用了Reducer来描述 action 如何改变 state tree。

Reducer 只是一些纯函数,它接收先前的 state 和 action,并返回新的 state。 --Redux
中文文档

Lodash

Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。我相信很多小伙伴也经常用到吧,这也是纯函数代表。

当然还有很多,这里就不一一举例了,总的来说,纯函数还是十分常见的。

我们如何合理去使用

在实际开发中,我们可以合理的去运用纯函数来提高我们的开发效率和代码质量。

纯函数组件

我们可以使用纯函数的的方式来创建组件:

function Header(props) {return <h2>{props.text}</h2>
}

对比一下使用Class(类)组件的方式创建组件:

class Header extends React.Component {render() {return <h1>{this.props.text}</h1>}
}

我们可以总结出纯函数组件的一些优点:

  • 无副作用,我们不用担心副作用带来的一些难以捕捉的问题
  • 语法更简洁,可读性好,代码量相对较小,易复用
  • 占用内存小,无生命周期和状态管理,提升了性能

当然纯函数组件也有自己的缺点,例如:没有生命周期。

生命周期有时候并不可少,所幸现在我们也已经有了很好的解决方案——react-hooks。利用hooks函数,我们可以在函数组件中使用等价于生命周期,状态管理等方法。

合理运用纯函数编写公共方法

在编写公共方法的时候,我们尽量用纯函数来进行编写。

假设我们要编写一个把数组中的小写字母转为大写字母的公共方法:

let lists = ["q","w","e"];
let upperCaseLists = () => {let arr = [];for (let i=0, length= lists.length; i<length; i++) {let item = lists[i];arr.push(item.toUpperCase());}lists = arr;
}

上面这个函数虽然可以实现逻辑复用,但是有副作用,肯定是不适合用来做公共方法的,所以我们要优化它:

let upperCaseLists = (value) => {let arr = [];for (let i=0, length= value.length; i<length; i++) {let item = value[i];arr.push(item.toUpperCase());}return arr;
}

使用可读性更好的forEach来优化:

let upperCaseLists = (value) => {let arr = [];value.forEach((item) => {arr.push(item.toUpperCase());})return arr;
}

继续用map进一步优化:

let upperCaseLists = (value) => {return value.map((item) => item.toUpperCase())
}

是不是很简洁?具体方法怎么优化要根据实际情况和业务需求来。

参考

https://segmentfault.com/a/1190000007491981

https://cuggz.blog.csdn.net/article/details/113792471

https://www.redux.org.cn/

最后

纯函数这个概念其实并不复杂,在没有深入了解之前我们工作中也一定遇到过,也在不经意间用过。只有要合理的去运用它,就是开发中的一把利器。

纯函数是什么?怎么合理运用纯函数?相关推荐

  1. 虚函数,虚基类 与纯虚函数 二

    虚函数    还是先看代码 class A { public:     void funPrint(){cout<<"funPrint of class A"<& ...

  2. 纯函数、柯里化、组合函数的解析以及代码实现

    文章目录 一.纯函数的概念和理解 二.JavaScript柯里化 1.柯里化的理解 2.将函数柯里化的代码实现 三.组合函数 1.组合函数的理解 2.通用的组合函数的实现 一.纯函数的概念和理解 纯函 ...

  3. CorelDRAWX4的C++插件开发(四十一)纯C++插件开发(5)实现六个纯虚函数

    这一节我们实现六个剩余的纯虚函数,先上代码 HRESULT __stdcall CongLingKaiShi::QueryInterface(REFIID riid, void** ppvObject ...

  4. JavaScript函数式编程(纯函数、柯里化以及组合函数)

    JavaScript函数式编程(纯函数.柯里化以及组合函数) 目录 JavaScript函数式编程(纯函数.柯里化以及组合函数) 前言 1.纯函数 1.1.纯函数的概念 1.2.副作用 1.3.纯函数 ...

  5. 什么是纯虚函数 纯虚函数的作用 如何定义使用纯虚函数

    什么是纯虚函数 纯虚函数的作用 如何定义使用纯虚函数   一 定义: 纯虚函数是一种特殊的虚函数,它的一般格式如下:  class <类名>  {  virtual <类型>& ...

  6. C++继承、虚函数、覆盖、多态、纯虚函数

    一.什么是继承 1.当遇到问题时,先查看现有的类能够解决一部分问题,如果有则继承该类,在此类的基础上进行扩展来解决问题,以此可以缩短解决问题的时间(代码复用) 2.当遇到一个大而复杂的问题时,可以先把 ...

  7. react之纯函数、函数组件、类组件、纯组件

    一.纯函数 Pure Function 定义:一个函数的返回结果只依赖于它的参数,并且在执行的过程中没有副作用,我们就把该函数称作纯函数. - 特点: 1.函数的返回结果只依赖与它的参数(同一个输入只 ...

  8. 什么是纯函数_以及为什么要用纯函数?

    当我第一次听到 "纯函数 (Pure Function)" 这个术语的时候我很疑惑.常规的函数做错了什么?为什么要变纯? 为什么我需要纯的函数? 除非你已经知道什么是纯函数,否则你 ...

  9. 函数、返回-Sql Server常用函数之统计、算数、字符串函数-by小雨

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 统计函数 Ø  AVG(expression)函数----按列算计平均值 Ø  SUM(expression)函数----按列算计值 ...

  10. 构造函数不可以声明为虚函数,析构函数可以声明为虚函数

    构造函数不能声明为虚函数,而析构函数可以声明为虚函数,在有的情景下析构函数必须声明为虚函数.  不建议在构造函数和析构函数里调用虚函数. 构造函数不能声明为虚函数的原因? 构造一个对象时,必须知道对象 ...

最新文章

  1. win32下安装mingw32和cmake来编译opencv2.4.9
  2. 优酷电视剧爬虫代码实现一:下载解析视频网站页面(3)补充知识点:htmlcleaner使用案例...
  3. TCP/IP的基本工作原理
  4. IntelliJ IDEA for Mac在MacOS模式下的版本控制/本地历史记录快捷键(VCS and Local History Shortcut)
  5. LoRa、Sigfox和NB-IoT在物联网趋势中谁是你的最佳拍档?
  6. centos安装ipconfig和telnet命令
  7. .NET存储过程入门
  8. Android系统---- 全面屏(18:9屏幕)适配指南
  9. 达索系统成立“大土木工程达索系统BIM技术推进联盟”深化应用、共享经验
  10. 牛客网–华为机试在线训练6:质数因子
  11. mysql数据卸载工具_如何把Mysql卸载干净(亲测有效)_Mysql_数据库
  12. CUDA编程:笔记1
  13. mysql按照音序排列_如何按音序排列
  14. 知识树沉淀总结-领域驱动设计DDD
  15. 车载以太网第二弹-实锤|SOME/IP概述及TC8 SOME/IP 测试实践
  16. ncnn报无法将参数 1 从“std::string”转换为“const ncnn::DataReader
  17. matlab中符号函数sgn,编程里的函数符号都是什么意思?
  18. tring.Format格式化用法
  19. 谷歌开源漏洞跟踪工具 Monorail 存在跨站点搜索漏洞
  20. 百度大脑UNIT升级,五步完成对话模型私有化部署

热门文章

  1. 10进制转16进制(采用移位实现)
  2. linux 电源管理 唤醒,Android 4.0 中的PowerManager(电源管理--休眠唤醒) [转]
  3. Mysql命令行登录和退出
  4. vue 自定义组件并上传到 npm
  5. 达人评测 锐龙R5 7530U和酷睿i7 1260p选哪个好
  6. 一位全加器的设计和交通灯控制器EDA
  7. WEB安全基础入门-概念名词
  8. 40亿美元!张一鸣拿下字节版王者荣耀,过渡期给员工发奖金
  9. 银盐-市场现状及未来发展趋势
  10. 关于请人助力砍价的一点感想(需要安装APP)