重学javaScript (十六)|纯函数和组合函数

125 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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))

来看下运行结果

image.png