函数式编程中有一个非常重要的概念叫做纯函数,JS符合函数式编程的范式,所以也有纯函数的概念
比如react中的redux中的reducer,就被要求是一个纯函数
那么 什么是纯函数呢?
纯函数的定义:
- 确定的输入,会产生确定的输出
- 不会产生副作用
那么 什么又是副作用呢?
在这里副作用的意思就是在执行一个函数的时候,除了返回函数值以外,还对调用函数产生了附加的影响,比如修改了全局变量,修改了参数或者改变外部的存储。
纯函数在执行的过程中不能产生这样的副作用,有副作用的话往往容易产生不易发觉的BUG
纯函数的案例
var names = ["abc", "cba", "nba", "dna"]
// slice只要给它传入一个start/end, 那么对于同一个数组来说, 它会给我们返回确定的值
// slice函数本身它是不会修改原来的数组
// slice -> this
// slice函数本身就是一个纯函数
// var newNames1 = (0, 3)
// (newNames1)
// (names)
// ["abc", "cba", "nba", "dna"]
// splice在执行时, 有修改掉调用的数组对象本身, 修改的这个操作就是产生的副作用
// splice不是一个纯函数
var newNames2 = (2)
(newNames2)
(names)
纯函数的练习
// foo函数是否是一个纯函数? 是
// 1.相同的输入一定产生相同的输出
// 2.在执行的过程中不会产生任何的副作用
function foo(num1, num2) {
return num1 * 2 + num2 * num2
}
// bar不是一个纯函数, 因为它修改了外界的变量
var name = "abc"
function bar() {
("bar其他的代码执行")
name = "cba"
}
bar()
(name)
// baz也不是一个纯函数, 因为我们修改了传入的参数
function baz(info) {
= 100
}
var obj = {name: "why", age: 18}
baz(obj)
(obj)
// test是否是一个纯函数? 是一个纯函数
// function test(info) {
// return {
// ...info,
// age: 100
// }
// }
// test(obj)
// test(obj)
// test(obj)
// test(obj)
纯函数的优势(为什么纯函数在函数式编程中非常重要)
因为可以放心的编写和使用
- 你在写的时候保证了函数的纯度,在函数内部只有处理内部逻辑,不需要关心传入的内容是如何获得的或者以来其他的外部变量是否已经发生了修改
- 你在用的时候,你可以十分确定你的输入内容不会被篡改,一定会有一个确定的输出。