#作者:一像素
在函数式编程的思想中,提出了函数不产生 “副作用”(side effect)的 基本特点,其中的函数就指的就是 “纯函数”。“纯函数” 是函数式编程的重要的概念,是函数式编程的基础。 今天,大鱼结合自己在实际使用中的理解,用通俗易懂的的语言跟大家聊一聊 “纯函数”。
首先,“函数”最早是出现在数学范畴中的术语,用来描述自变量和因变量之间的映射关系,即 y = f (x) 。从此公式可以看出,y的值只与自变量x的输入值有关,“纯函数”也遵循这一原则:
原则一:函数的返回结果只依赖其参数
用过react框架的同学都知道,状态管理工具 Redux 用一个叫做 Reducer 的函数来处理事件,其中Redux 的 Reducer 就是典型的“纯函数”。Reducer 就是归纳一个列表(action的列表)和一个 initialValue(初始的 State)得到一个新的 value(新的 State)的过程,过程中非常重要的一点是reducer不能有 “副作用”。把上面的概念连起来,举个例子:
下面的代码声明了 reducer:
const defaultState = 0; const reducer = (state = defaultState, action) => { switch (action.type) { case 'ADD': return state + action.payload; default: return state; } };
它的作用大概是这样,根据应用的状态和当前的 action 推导出新的 state,期间未对函数外的变量产生额外的影响:
(previousState, action) => newState
createStore接受 Reducer 作为参数,生成一个新的 Store。以后每当store.dispatch发送过来一个新的 Action,就会自动调用 Reducer,得到新的 State。
上述代码中可以看到,reducer 只与输入的 action有关,且未产生额外的影响,关于“副作用”,如不容易理解,请看下面的示例,比如这样一个函数:
function getAge(user) { user.age = user.age + 1; return user.age; }
这个函数就有副作用,每一次相同的输入,都可能导致不同的输出,而且还会影响输入 user 的值,再比如:
let b = 10; function compare(a) { return a >= b; }
这个函数也有副作用,就是依赖外部的环境,b 在别处被改变了,返回值对于相同的 a 就有可能不一样。而 Reducer 是一个纯函数,对于相同的输入,永远都只会有相同的输出,不会影响外部的变量,也不会被外部变量影响,不得改写参数。
到这里,引出“纯函数”的 另外一个原则:
原则二:执行过程中没有副作用
通过上面例子和解析,我们不难为 “纯函数” 定义:返回结果只依赖其参数,且不会影响外部的变量,也不会被外部变量影响(即无“副作用”)的函数,叫做“纯函数”。
以上内容解释了纯函数的基本概念,如帮到了你,请三连,更多问题欢迎同学积极探讨