函数式编程学习-0函数式编程定义-day1

39 阅读1分钟

0 函数式编程定义

  1. 定义:Functional Programming,FP;
  2. 对比:函数式编程:对运算过程进行抽象;面向对象:封装、继承和多态
        //非函数式
        let num1 = 1
        let num2 = 2
        let sum1 = num1 + num2
        console.log(sum1)
    
        //函数式
        function add (n1,n2){
            return n1 + n2
        }
        let sum = add(3,4)
        console.log(sum2)
        ```
    
  3. 函数式编程中的函数指的不是程序中的函数(方法),而是数学中的函数即映射关系:y=f(x);相同的输入始终要得到相同的输出.
  4. 前置知识
    • 函数是一等公民
    • 高阶函数
    • 闭包
    1. 函数是一等公民

      • 函数可以存储在变量中 let fn = function(){cosole.log('我是函数')}
      • 函数作为参数
      • 函数作为返回值
      const BlogController = {
       index(posts){return Views.index(posts)},
       show(posts){return Views.show(posts)},
       create(posts){return Db.create(posts)},
       update(posts,attrs){return Db.update(posts,attrs)},
       destory(posts){return Db.destory(posts)},
      }
      //优化:把函数赋值给另一个函数的方法
      const BlogController = {
       index: Views.index,
       show: Views.show,
       create: Db.create,
       update: Db.update,
       destory: Db.destory,
      }
      
      
      • 函数是一等公民是高阶函数、柯里化等的基础。
    2. 高阶函数(heigh-order function)

      • [可以把函数作为参数传递给另一个函数]
      function filter(array, fn) {
           let result = []
           for (let i = 0; i < array.length; i++) {
               if (fn(array[i])) {
                   result.push(array[i])
               }
           }
           return result
       }
      
       //测试
       let arr = [1, 2, 3, 4, 5]
       let r = filter(arr, function (item) {
           return item % 2 === 0
       })
       console.log(r);
       //[ 2, 4 ]
      
      • [可以把函数作为另一个函数的返回结果]
      // 2. once 使得函数只执行一次
       function once(fn) {
           let done = false
           return function () {
               if (!done) {
                   done = true
                   //arguments是数组,它将作为参数传给fn.
                   return fn.apply(this, arguments)
               }
           }
       }
      
       //测试
       let pay = once(function (money) {
           console.log('支付了:', money);
       })
      
       pay(5)
       pay(5)
       pay(6)
       pay(6)
       
       //支付了: 5
      
  5. 使用高阶函数的意义
  • 抽象可以帮我们屏蔽细节,只需关注与我们的目标
  • 告诫函数是用来抽象通用问题
//面向过程
let array = [1,2,3,4]
for (let i = 0; i < array.length; i++){
    cosole.log(arrray[i])
}

//高阶函数
let array = [1,2,3,4]
forEach(array,item => {
    console.log(item)
})

let array = [1,2,3,4]
let r = filter(array,item => {
    return item % 2 === 0
})
  1. 常用的高阶函数
  • forEach
  • map
  • filter
  • every
  • some
  • find/findindex
  • reduce
  • sort ...