函数式编程

219 阅读4分钟

1. 什么是函数式编程

函数式编程(functional Programming 简称 FP) :常听说的有 面向对象编程 和 面向过程编程  
面向对象编程的思维方式:把现实世界的事物 抽象成程序中的 类和对象 通过封装、继承 多态 来  
演示事物世界的联系

2. 函数的概念

//函数可以存储在变量中

//函数可以作为参数

//函数可以作为返回值

//在JavaScript中 函数是一个对象 可以通过 (new Function)的方式来生成一个函数 我们可以把函数存储在变量或者数组中 还可以把函数作为另一个函数的返回值

//new Function()

var f1 = new Function("a","b","return a+b")

console.log(f1(1,4));
  • 函数作为参数 & 函数作为返回值
//函数作为参数
function foreach(arr, fn) {
    for (let i = 0; i < arr.length; i++) {
        fn(arr[i])
    }
}

let arr = [2, 3, 4, 5]

foreach(arr, function (item) {
    console.log(item);
})

function filter(arr,fn){
let arrs = new Array
    for (let i = 0; i < arr.length; i++) {
        if(fn(arr[i])){
            arrs.push(arr[i])
        }
    }
    return arrs
}

let att = filter(arr,(item)=>{
    return item%2===0
})

console.log(att);

//函数作为返回值
function once(fn){

    let done = true
    return function(){
        if(done){
            done = false
            return fn.apply(this,arguments)
        }
    }
}

let py = once(function(money){
    console.log("你看我执行了多次次",money);
})
py(1)
py(2)
py(3)
py(4)
py(5)

3. 纯函数

3.1 什么是纯函数

相同的输入永远会得到相同的输出 而且没有任何观察的副作用
纯函数就类似数学中的函数 (用于描述输入和输出之间的关系)

3.2 纯函数的好处

1. 可缓存
    因为纯函数对相同的输入值始终又相同的结果 所以可以把纯函数的结果缓存起来

2. 可测试
    纯函数让测试更方便 (单元测试就是在断言函数输出的结果 所有纯函数都是可测试的函数)

3. 并行处理
    在多线程环境下并行操作共享的内存数据很可能会出现意外,而纯函数不需要访问共享的内存数据 
    所以在并行环境下可以任意运行纯函数(web worker) 在ES6以后新增了一个web worker 可以执行多线程

3.3 纯函数的副作用

1. 副作用让一个函数变的不纯 ,纯函数根据相同的输入返回相同的输出 如果函数依赖外部的状态 就无法保证输出相同 就会带来副作用

2.所有外部交互都有可能带来副作用 副作用也使得方法通用性下降不适合扩展和可重用性,同时副作用会给程序带来安全隐患,给程序带来不确定性 但是副作用不可能完全禁止 尽可能控制他们在可控范围内发生

3.副作用来源
    配置文件
    数据库
    获取用户输入等等

4. 函数柯里化

4.1 函数柯里化概念

1.当一个函数有多个参数的时候 对当前函数做改造,可以只调用一个函数传递部分的参数,并且让这个函数返回一个新的函数,新的函数接收剩余的函数 并且返回相应的结果 这就是函数的柯里化

2.总的来说柯里化也就是: 当一个函数有读个参数的时候 先传递一部分参数调用它 (这部分函数以后永远不变)然后返回一个新的函数接收剩余的参数 并且返回结果

4.2 函数柯里化总结

1.柯里化可以让我们给一个函数传递少的参数得到一个已经记住了某些固定参数的新函数

2.这是一张对函数参数的缓存:(柯里化记住了 某些固定参数 其实就是柯里化使用了闭包 记住了我们传入的值 这部分其实就是柯里化的核心)

3.柯里化让函数变的更灵活 让函数的粒度更小

4.柯里化可以把多元函数转换成一元函数 可以组合使用函数产生强大的功能

5. 函数组合

1.函数组合 可以让我们把多个函数 组合生成一个新函数

2.在执行过程中 我们把参数传递给执行的第一个函数

3.当它执行完以后会返回一个中间结果 并且把中间结果返回给下一个函数处理

4.最后一个函数会将处理后的最终结果返回 这就是函数组合

5.代码演示
    function compose(f,g){
      return function(val){
        return f(g(val))
      }
    }
    function reverse(array){
      return array.reverse()
    }
    function first(array){
      return array[0]
    }
    const list = compose(first,reverse)
    console.log(list([1,2,3,4]));