JavaScript----什么是纯函数

转载 2018年04月15日 20:31:31

定义

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

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

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
  • 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

我们把原来的 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

现在情况发生了变化,我在 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
}
  • 1
  • 2
  • 3
  • 4
  • 5

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

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

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

总结

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

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

什么叫pure function(纯函数)

在Knockout中,用到了pureComputer(),其原理来自于纯函数(pure function)。那么,什么叫纯函数呢? 纯函数 (来自:http://en.wikipedia.org/...
  • hongweigg
  • hongweigg
  • 2015-03-03 10:55:44
  • 10432

纯虚函数与纯虚类

什么是纯虚函数 纯虚函数的语法 1. 将成员函;数声明为virtual 2. 后面加上=0 3. 该函数没有函数体 例如class CmdHandler { public: ...
  • linjingtu
  • linjingtu
  • 2016-08-02 16:02:13
  • 1379

一步一步学习C++(类)之虚函数和纯虚数

1、 该函数必须与基类的虚函数有相同的名称 2、 该函数必须与基类的虚函数有相同的参数个数和相对应的参数类型。 3、 该函数必须与基类的虚函数有相同的返回值,或满足类型兼容规则的指针,引用...
  • xy010902100449
  • xy010902100449
  • 2015-04-09 19:51:32
  • 1734

纯虚函数,虚函数,纯虚类,虚类

纯虚类有以下特征: 含有一个纯虚函数的类,叫做纯虚类。纯虚类不可以定义对象。 我个人觉得这个说法应该就是把纯虚类的主要特点说明了: 1、只要有一个纯虚函数。就称为纯虚类。 所以如果...
  • xiguankong
  • xiguankong
  • 2015-01-17 17:19:08
  • 327

函數副作用-纯函数

函数副作用   在计算器科学中,函数副作用指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。例如修改全局变量(函数外的变量)或修改参数。 函数副作用会给程序设计带来不必要的麻...
  • crazyhacking
  • crazyhacking
  • 2012-12-07 21:39:42
  • 2230

JavaScript-可维护代码编写,函数式编程与纯函数

JavaScript-可维护代码编写,函数式编程与纯函数JavaScript是函数式编程与面向对象编程的混合编程语言,加上本身一些可扩展性(比如:函数参数个数及类型的不确定),使得JavaScript...
  • qiqingjin
  • qiqingjin
  • 2016-05-26 21:02:59
  • 1504

什么是函数.doc。什么是函数.doc

  • 2010年06月10日 22:00
  • 51KB
  • 下载

C++纯虚数和抽象类

  • 2009年04月19日 23:58
  • 810B
  • 下载

Scala 最佳实践:纯函数

我们所处的是一个命令式编程(imperative programming)的时代,这也是我们为何更喜欢用命令式风格写代码的原因。在我们周围的一切都是可变的。虽然可变性并没有那么差劲,但是共享可变性就有...
  • simple_the_best
  • simple_the_best
  • 2017-07-26 17:06:21
  • 340

react 纯函数组件中使用ref属性方法

1.您不能ref在功能组件上使用该属性,因为它们没有实例: 如下 function MyFunctionalComponent() { return ; } class Parent ex...
  • Meditate_MasterYi
  • Meditate_MasterYi
  • 2018-01-17 16:04:19
  • 220
收藏助手
不良信息举报
您举报文章:JavaScript----什么是纯函数
举报原因:
原因补充:

(最多只允许输入30个字)