一、函数组合
    又叫 饲养函数,compose。由纯函数、偏函数、柯理化函数组成,能够控制数据传递,形成一种有效执行的组合。
    左倾:在函数的参数中执行函数

    1. function toUpperCase(str){
    2. return str.toUpperCase()
    3. }
    4. function exclain (str){
    5. return str + '!'
    6. }
    7. //将函数组合起来,返回一个新函数,将组合的函数包裹起来。
    8. function ComposeToUpperCaseAndExclain(toUppercaseFn,ExclainFn){
    9. return function(str){ //关键步骤,返回一个包裹函数组合的函数。
    10. return ExclainFn(toUppercaseFn(str)) //左倾,先执行参数中的函数,再执行函数。
    11. }
    12. }
    13. 数据在函数之间(像一个管道)流动处理

    抽象组合工具函数
    关键点: 函数个数不定,左倾(这里用reduceRight就很方便了)。

    1. function split(str){
    2. return str.split('')
    3. }
    4. function reverse(arr){
    5. arr.reverse()
    6. return arr
    7. }
    8. function join(arr){
    9. return arr.join('~')
    10. }
    11. function toUpperCase(str){
    12. return str.toUpperCase()
    13. }
    14. function exclain(str){
    15. return str + '!'
    16. }
    17. function composeFunction(){
    18. let len = argsArr.length - 1,
    19. argsArr = Array.prototype.slice.call(arguments);
    20. return function(x){
    21. let res = argsArr[len](x);
    22. while(len--){
    23. console.log(res)
    24. res = argsArr[len](res)
    25. }
    26. return res
    27. }
    28. }
    29. let compositionFn = composeFunction(exclain,toUpperCase,join,reverse,split);
    30. function composingFunctionWithReduceRight(){
    31. let args = [...arguments];
    32. return function(x){
    33. console.log(x)
    34. let res = args.reduceRight((accumulotar,elem,index)=>{
    35. console.log(accumulotar,elem,index)
    36. return elem(accumulotar)
    37. },x)
    38. return res
    39. }
    40. }
    41. console.log(compositionFn('not a bum'))

    二、结合律 associativity
    什么是结合律:在函数组合时,先将参数进行组合,不同组合方式得到的结果是一样的。不管怎么结合,都是对
    链式操作的分组串联包裹

    1. function split(str){
    2. return str.split('')
    3. }
    4. function reverse(arr){
    5. arr.reverse()
    6. return arr
    7. }
    8. function join(arr){
    9. return arr.join('~')
    10. }
    11. function composingFunctionWithReduceRight(){
    12. let args = [...arguments];
    13. return function(x){
    14. let res = args.reduceRight((accumulotar,elem,index)=>{
    15. return elem(accumulotar)
    16. },x)
    17. return res
    18. }
    19. }
    20. let compositionFn1 = composingFunctionWithReduceRight(join,reverse,split),
    21. compositionFn2 = composingFunctionWithReduceRight(join,composingFunctionWithReduceRight(reverse,split)),
    22. compositionFn3 = composingFunctionWithReduceRight(composingFunctionWithReduceRight(join,reverse),split);

    三、pointfree,执行函数时,无需传入数据参数(返回了一个闭包新函数,新函数会接受自己的数据参数)

    1. function compose (){
    2. let args = [...arguments];
    3. return function(x){
    4. let res = args.reduceRight((accumulotar,elem=>{
    5. return elelm(x)
    6. },x)
    7. return res
    8. }
    9. }
    10. let fn = compose() //调用函数时无需传递数据参数
    1. function classFilter(data){
    2. return data.classes > 20 && data //如果满足条件,会继续走返回最后一个值
    3. }
    4. function isFreeFilter(data){
    5. return data.isFree && data
    6. }
    7. function composingFunctionWithReduceRight(){
    8. let args = [...arguments];
    9. return function(x){
    10. let res = args.reduceRight((accumulotar,elem,index)=>{
    11. return elem(accumulotar)
    12. },x)
    13. return res
    14. }
    15. }
    16. let classesData = [
    17. { classes: 21, isFree: true},
    18. { classes: 11, isFree: false},
    19. { classes: 31, isFree: true},
    20. { classes: 19, isFree: true},
    21. { classes: 20, isFree: true}
    22. ]
    23. let arr = [],
    24. f = null;
    25. classesData.forEach((item)=>{
    26. f = composingFunctionWithReduceRight(classFilter, isFreeFilter);
    27. f(item) && arr.push(item)
    28. })
    29. console.log(arr)