什么是“纯函数”?(#js纯函数 #函数式编程 #Redux Reducer)

 #作者:一像素

  在函数式编程的思想中,提出了函数不产生 “副作用”(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 是一个纯函数,对于相同的输入,永远都只会有相同的输出,不会影响外部的变量,也不会被外部变量影响,不得改写参数。
到这里,引出“纯函数”的 另外一个原则:

原则二:执行过程中没有副作用

通过上面例子和解析,我们不难为 “纯函数” 定义:
返回结果只依赖其参数,且不会影响外部的变量,也不会被外部变量影响(即无“副作用”)的函数,叫做“纯函数”。

 以上内容解释了纯函数的基本概念,如帮到了你,请三连,更多问题欢迎同学积极探讨

原文地址:https://www.cnblogs.com/liuyongqi/p/14722477.html