compose

在函数式编程当中的一个重要概念:函数组合;也就是把处理数据的各个函数连接起来的一个函数。

reduce实现:

执行顺序式从左往右

function compose(...funcs){
  //没有放函数,那就返回传入参数
  if(funcs.length === 0)return (num)=>num
  //函数组合长度为1,返回函数
  if(funcs.length === 1)return funcs[0]
  //其余情况,对funcs进行reduce,里面的函数会从左往右执行,
  //第一个函数执行完返回的结果将会传递到下一个函数中作为参数继续执行
  
  //总体会返回一个方法,用法:compose(函数组合)(传入参数num)
  return funcs.reduce((pre,cur)=>{
    //返回一个函数作为下一个pre,函数内执行cur(pre(num)),
    return (num)=>{
      //pre(num)是函数组合内上一个函数执行,
      //cur(pre(num))指的是当前函数执行
      //返回cur(pre(num))作为新的参数给下个函数继续执行
      return cur(pre(num))
    }
  })
}

实现该函数的主要使用的reduce方法

用法arr.reduce(callback,[initialValue])

callback

callback可以接收四个参数

(1)previousValue:上一次调用返回的值,或者时init值

(2)currentValue:当前被处理的值

(3)currentIndex:当前元素在数组的索引

(4)array:调用reduce的数组

initialValue

initialValue作为初始值,当第一次调用callback函数时,initialValue会作为previousValue,currentValue会使用数组的第一个值;

如果initialValue没有设定,previousValue将会使用数组的第一个值,currentValue使用数组的第二个值;

initialValue的设定也会影响index索引值,initialValue有设定,索引值从0开始,否则索引值从1开始;

递归实现:

执行顺序式从右往左

function compose(...funcs){
  //拿funcs的长度
  let len = funcs.length
  //用来承接每次函数执行后的结果
  let res = null 
  //返回一个函数,初始参数还得自己加,也就是compose(函数组合)(初始参数)
  return function func(...arg){
    //每次函数运行的结果
    res = funcs[len - 1].apply(null,arg)
    if(len>1){
      len--
      //函数组合中还有函数就继续执行,res就是函数执行后得到的结果;
      //返回func并把res作为参数,继续执行func;
      return func.call(null,res)
    }else{
      //函数组合中没有了函数便返回res最终结果
      return res
    }
  }
}

实现该函数的主要使用的是递归,简单的说就是自己内部调用自己,直到条件达成返回;

apply方法与call方法

语法:

function.call(thisArg,arg1,arg2,...)

function.apply(thisArg,args)

两者作用几乎一样,都是调用一个具有只当this值的函数;

区别:给定的参数;call接收的参数是一个参数或多个参数;而apply接收的参数是一个数组;

thisArg

如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动替换为指向全局对象,原始值会被包装。

这里实现当中apply和call其实都可以不加,或者说加了是为了明确函数执行时的this执行问题;

个人笔记