今天我们提到 pure function,那相对的也会有, not a pure function, 以下
我们先来的, not a pure function 的实例吧。
什麽是 pure function,
譬如我们今天去文具店想买笔和笔记本,
一支笔 20 元,一本笔记本 40 元。
想计算总共花了多少钱 ?
let pen = 20;
let notebook = 40;
const totalPrice = () => {
return pen + notebook;
}
totalPrice(); // 60;
如果今天突然你在购买的途中,老板突然改了笔的定价为 30 元
那接下来你就会计算出 70 元的价格,如果你有很多状态都在外部,
这时候你就会因为 pen 和 notebook 的变数是 mutable,就会产生超过 side effect,
你根本不知道哪边 code 被改了,造成 totalPrice 的结果跟原本不一致。
这是就是 not a pure function 的坏处。
let pen = 20;
let notebook = 40;
const totalPrice = () => {
return pen + notebook;
}
totalPrice(); // 60;
**pen = 30;**
totalPrice();// 70
那什麽是 pure function
Pure function 意指相同的输入,永远会得到相同的输出,而且没有任何显着的 side effect。
那什麽是 side effect ?
副作用可以包含,但不限於:
- 更改档案系统
- 在资料库写入纪录
- 发送一个 http 请求
- 可变资料
- 印出至画面 / log
- 取得使用者输入
- DOM 查询
- 存取系统状态
所以我们要理解 pure function 就是只要是相同的 input 执行有相同的 output,
然後 input to output 可以是 一 对 一,也可以是多对一,如下图。
假设是相同的 input 每次显示结果 (output) 不一样,就不是 pure function 了。
图片出处: https://www.cuemath.com/algebra/one-to-one-function/
所以我们可以来看看哪些是 pure function
- map
const plusOne = [1,2,3,4].map(i=>i+1); // [2,3,4,5]
- reduce
const total = [1,2,3,4].reduce((total,target)=>total+target,0); // 10
以上的 function 就是只要相同 input 就永远是相同 output
那第一个范例怎麽改写呢?
let pen = 20;
let notebook = 40;
const totalPrice = (x,y) => {
return x + y;
}
totalPrice(pen,notebook); // 60;
**pen = 30;**
totalPrice(pen,notebook);// 70
其实只要把 pen, notebook 的参数固定是从 function 的参数传入,
这样不管传入得数值为何,他的功能就是加总而已,在发生问题时,
就可以知道可能是 pen, notebook 的参数问题,让 function 功能单纯化。
>>: Day_21 : 让 Vite 来开启你的Vue 之 跨元件资料传递 Provide & Inject
AsyncTask非同步任务,或称异步任务,是一个相当常用的类别,是专门用来处理背景任务与UI的类别...
摘要 交叉验证不同方法组合的模型准确率 1.1 参数说明 1.2 程序码 选择模型组合方法 2.1 ...
选择在今天讲这个可能有点奇怪,但实在是不知道要在哪天讲比较适合,又很想把这篇打出来!!於是这篇文就诞...
今天我们要先来介绍一下 Helm,由於 Open-Match 是基於微服务建立的分散式架构,在部署上...
我们稍微改写一下之前所写的加法函式 ...