持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情
前言
函数式编程是一门古老的技术。函数式编程的核心概念很简单,就是将函数存到变量里,用在参数里,用在返回值里。 javaScript作为一门函数是第一公民的编程语言,是支持这一编程方式的,今天我们来学习下其中的纯函数和组合函数
纯函数
定义
维基百科中这样说道:
在[程序设计]中,若一个[函数]符合以下要求,则它可能被认为是纯函数:
- 此函数在相同的输入值时,需产生相同的输出。函数的输出和输入值以外的其他隐藏信息或[状态]无关,也和由[I/O]设备产生的外部输出无关。
- 该函数不能有语义上可观察的[函数副作用]),诸如“触发事件”,使输出设备输出,或更改输出值以外物件的内容等。
简单总结下就是
- 输入相同的参数必然有相同的结果返回
- 函数执行时,没有任何副作用
- 不受外界环境的影响
什么是副作用
定义中提到了副作用这个词,那么什么是副作用呢
- 在计算机科学中,副作用就是你在函数的执行中造成了影响比如如下的代码
var a = 10
function fnc () {
a = 5
}
在fn函数的执行中修改了全局变量a的值,这就是个副作用
关于纯函数栗子
- 编写一个求两个最大值的函数fn,只要我们输入传入固定的值,函数就返回固定的值,执行的过程中无任何副作用
function max (m, n) {
if(m>n) {
return m
}else {
return n
}
}
- 但如果此时我们在fn的内部修改一下全局变量的值,虽然它依然是固定的输入和输出,但因为改变了全局变量,所以就产生了副作用,它就不能叫纯函数了
let apply = 100
function max (m, n) {
apply = '哈哈哈'
if(m>n) {
return m
}else {
return n
}
}
JS内置函数的纯函数
- 比如数组的不改变原数组的方法就是纯函数
- 改变原数组的就不是
纯函数的优点
保证了函数的职能单一,并且不对外界造成影响
组合函数
定义
在计算机科学中,组合函数是将多个简单的函数,组合成一个更复杂的函数的行为或机制。每个函数的执行结果,作为参数传递给下一个函数,最后一个函数的执行结果就是整个函数的结果。
栗子
- 需求: 需要对一个数字先进行加法运算,再进行乘法运算 普通做法
let a = 10
// 加法
function add(m) {
return m+10
}
// 乘法
function tennumer(m) {
return m*10
}
如果我们用组合函数,就是这样的,将 add和tennumer组合起来
let a = 10
// 加法
function add(m) {
return m+10
}
// 乘法
function tennumer(m) {
return m*10
}
// 组合函数
function composeNumber (fn1,fn2) {
return function (m) {
return fn1(fn2(m))
}
}
let com = composeNumber(add, tennumer)
console.log(com(a))
来看下运行结果