函数式编程

函数式编程是一种编程范式。它把计算当成是数学函数的求值,从而避免改变状态和使用可变数据。它是一种声明式的编程范式,通过表达式和声明而不是语句来编程

 function compose(...funcs) {
     if (funcs.length === 0) {
       return arg => arg
     }

     if (funcs.length === 1) {
       return funcs[0]
     }
     return funcs.reduce((a, b) => {
       return (...args) => {
         return a(b(...args)) 
       }
     })
   }

   function fn1(x) {
      console.log('a')
      return x + 1
    }

    function fn2(x) {
      console.log('b')
      return x + 2
    }

    function fn3(x) {
      console.log('c')
      return x + 3
    }

    function fn4(x) {
      console.log('d')
      return x + 4
    }
    let composedFn = compose(fn1,fn2,fn3,fn4)
    let result = composedFn(1)

第一步,循环返回的第一个值是函数X,看下一步,所以X的参数就是fn3的返回值,
也就是说fn2的参数就是fn3的返回值

(...args) => {
   return fn1(fn2(...args)) 
 }

第二步, 循环返回的第二个值是函数Y

(...args) => {
  return X(fn3(...args))
}

第三步,reduce返回的第三个值是函数Z,这个函数作为reduce的最终返回值赋值给了composedFn

(...args) => {
  return Y(fn4(...args))
}

第四步,执行composedFn(1),也就是上一步fn4的参数是1.连起来执行就是从后往前一个一个执行

let composedFn = compose(fn1,fn2,fn3,fn4)
let result = composedFn(1)

柯里化

计算机科学中,柯里化(英语:Currying),是把接受多个参数函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

上面redux的例子中函数式编程用的很好,柯里化还真没在网上看到好的例子,全是a+b的例子...