纯函数是什么?

ByteAetherX
• 阅读 3879

纯函数就是一个函数,只不过具有一些特点,你可能平时开发中都有用到,只是没有意识到这是一个纯函数。

纯函数(Prue function)具有以下特点:
  1. 纯函数每一次调用时传入同样的参数,返回的都是同样的结果;它不会改变参数的值,也不会改变外部变量的值;它不会依赖于外部的变量,仅依赖于你传入的参数;
  2. 纯函数没有其他副作用(side effect)
  3. 如果你每次传入的参数一样,但是返回的结果不一样,则不是一个纯函数

Just show me the code:

一个纯函数:

/* 

    它接受两个参数:一个数组和一个要添加的项
    然后根据这两个参数,返回一个新的数组
    它没有改变原来参数的值
    每次调用时传递相同的值,返回的结果永远一样
    它没有修改外部的变量和数据
    
*/
let array = [1, 2, 3];

function addItemToArray(array, item) {
    return [...array, item];
}

addItemToArray(array, 4);

不是一个纯函数

/*
    这个函数 return 的值是一个数组
    这个数组是在原来的数组 array 的基础上,追加了一项
    它改变了外部变量
    每次执行函数时传入同样的值,返回的结果不相同
    所以它不是纯函数
*/
let array = [1, 2, 3];

function addItemToArray(array, item) {
    return array.push(item);
}

addItemToArray(array, 4);

一个纯函数:

/*
    它没有改变外部变量的值
    每次调用时如果传递的值相同,那每次返回的结果也相同
*/
let a = 1;
let b = 2;
function add(x, y) {
    return x + y;
}
add(a, b);

不是一个纯函数:

/*
    它改变了外部变量的值
    每次返回的结果都不一样。
*/
let a = 1;
function add(x, y) {
   return x += y;
}
add(a, 2);
纯函数的优点:

纯函数使代码更可靠,可利于测试与维护,在开发中应该尽可能多地使用纯函数。

哪些情况不适用纯函数:
  • 网络请求:根据网络请求返回不同的数据
  • 其他需要改变外部变量的函数

点赞
收藏
评论区
推荐文章
菜园前端 菜园前端
2年前
什么是函数柯里化?
原文链接:什么是函数柯里化?函数柯里化(HaskellBrooksCurry),当一个函数有多个参数的时候先传递一部分参数并且调用它(这部分参数后续不会进行改变),然后返回一个新的函数接收剩余的参数并返回结果。总结柯里化可以让我们给一个函数传递较少的参数得
菜园前端 菜园前端
2年前
什么是高阶函数?
原文链接:什么是高阶函数?有两种情况都可以被定义为高阶函数,第一种是把函数作为参数传递给另外一个函数,第二种是把函数作为另一个函数的返回结果。就像我们平时调用函数,一般都是传递值类型或者对象和数组等参数,或者是函数返回结果是值类型或者是对象和数组,高阶函数
Wesley13 Wesley13
3年前
JS 闭包(内存溢出与内存泄漏)(垃圾回收机制)
1.有关闭包定义闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量闭包的特性:函数内再嵌套函数内部函数可以引用外层的参数和变量参数和变量不会被垃圾回收机制回收
Stella981 Stella981
3年前
Boost Python官方样例(三)
导出C类(纯虚函数和虚函数)大致做法就是为class写一个warp,通过get\_override方法检测虚函数是否被重载了,如果被重载了调用重载函数,否则调用自身实现,最后导出的时候直接导出warp类,但是类名使用class,析构函数不需要导出,因为它会被自动调用纯虚函数编写C函
Stella981 Stella981
3年前
IDA Pro 权威指南学习笔记(十)
栈帧(stackframe)是在程序的运行时栈中分配的内存块,用于特定的函数调用如果一个函数没有执行则不需要内存,当函数被调用时就需要用到内存1.传给函数的参数的值需要存储到函数能够找到它们的位置2.函数在执行过程中可能需要临时的存储空间,通过声明局部变量来分配这类临时空间,这些变量在函数内部使用,函数调用完后,就无法再访问它们
Stella981 Stella981
3年前
JavaScript深入之参数按值传递
定义在《JavaScript高级程序设计》第三版4.1.3,讲到传递参数:ECMAScript中所有函数的参数都是按值传递的。什么是按值传递呢?也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。按值传递举个简单的例子:varvalue1;fun
Stella981 Stella981
3年前
Python中函数装饰器及练习
1)装饰器的理解:1、作用:在不改变原函数的基础上,给函数增加功能   2、返回值:把一个函数当作参数,返回一个替代版的函数3、本质:返回函数的函数4、应用场景:计时器、记录日志、用户登陆认证、函数参数认证2)无参函数装饰器  实例:被装饰的函数没有参数     执行结果为:  
Wesley13 Wesley13
3年前
2、Linux汇编——函数的工作原理
第四章函数的工作原理1、函数的组成部分    函数主要由以下几个成分组成:函数名、函数参数、局部变量、静态变量、全局变量、返回地址、返回值(1)函数参数及几个变量:这是在逻辑上对函数的涉及到的数据进行规划,实际上当前运行的指令只能通过直接、间接、立即数三种方式访问数据。(2)返回地址:在汇编语言中,实际上是某
菜园前端 菜园前端
2年前
前端同学都了解什么是副作用么?
原文链接:什么是副作用?副作用会让一个函数变的不纯,纯函数是根据相同的输入返回相同的输出,如果函数依赖于外部的状态就无法保证输出相同,就会带来副作用。副作用来源函数依赖外部状态(变量),但是副作用不可能完全禁止,尽可能控制在它们可控范围内发生。缺点副作用使
菜园前端 菜园前端
2年前
什么是纯函数?
原文链接:什么是纯函数?相同的输入永远会得到相同的输出,而且没有任何可观察的副作用。纯函数就类似数学中的函数(用来描述输入和输出之间的关系)yfn(x)纯函数库我们平时用的lodash其实就是纯函数库。纯函数的优点1.可缓存(直接提升性能)也就是我们平常说
基于Effect的组件设计 | 京东云技术团队
Effect的概念起源从输入输出的角度理解Effect编程中的Effect起源于函数式编程中纯函数的概念纯函数是指在相同的输入下,总是产生相同的输出,并且没有任何副作用(sideeffect)的函数。副作用是指函数执行过程中对函数外部环境进行的可观察的改变