Appearance
纯函数(Pure function)
纯函数是函数式编程中的基本组成单元。
特点
- 它只依赖于所提供的输入,而不依赖于在计算期间或调用之间可能发生变化的任何隐藏的或外部状态
- 它不会造成超出其范围的更改,例如修改全局对象或通过引用传递的参数。
非纯函数版本
javascript
let counter = 0;
function increament() {
// 函数内部改变了外部变量,因此具有副作用
return counter++;
}
使用非纯函数版本的 increment()
方法,外部变量 counter
的值可能会被其他代码所改变,因此调用 increment()
方法的结果是不可预见的。
纯函数版本
javascript
const increment = (counter) => counter + 1;
// The same input always return the same output
// 称之为引用透明,或者叫等式正确性
使用纯函数版本的 increment()
方法,我们传入同样的参数,总是返回同样的输出。
比如传入 increment(1)
,总是返回 2
,传入 increment(2)
,总是返回 3
。具有等式确定性。
可置换性(Replaceable)
Program = [Input] + [func1, func2, func3] -> OutPut
如果 func1, func2, func3 都是一个纯函数,那么我们可以用其产生的具体值等价替换,并且结果不会改变。
Program = [Input] + [val1, val2, val3] -> OutPut
数组原型中的非纯函数
Array.prototype
中有些方法会原地修改数组,而不是产生一个新的数组,你知道是哪些方法吗?
Details
会修改原数组的方法有 push()
、pop()
、shift()
、unshift()
、sort()
、splice()
和 reverse()
。