前端学习之函数式编程—高阶函数

Posted 萌萌的DDD

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端学习之函数式编程—高阶函数相关的知识,希望对你有一定的参考价值。

  什么是高阶函数(Higher-order function)

  •         可以把函数作为参数传递给另一个函数
  •         可以把函数作为另一个函数的返回结果

Part 1 可以把函数作为参数传递给另一个函数

实现forEach函数

// 高阶函数-函数作为参数

function forEach(array, fn) {
    for (let i = 0; i < array.length; i++) {
        fn(array[i])
    }
}

// 测试
let arr = [1, 2, 3, 4, 7, 8]

forEach(arr, function(item) {
    console.log(item)
})

// console.log ==> 1,2,3,4,7,8

实现filter函数

//filter
function filter(array, fn) {
    // 存储筛选后的结果
    let results = []
    for (let i = 0; i < array.length; i++) {
        // 如果满足条件返回true
        if (fn(array[i])) {
            // 追加到结果中
            results.push(array[i])
        }
    }
    return results
}

// 测试
let arr = [1, 2, 4, 5, 8, 9]

const r = filter(arr, function(item) {
    return item % 2 == 0
})
console.log(r);

// [2,4,8]

当函数作为参数,可以将函数的使用变化的更加灵活

同时通过函数的语义化使用起来更加便捷,不需要考虑代码是如何执行的,大大增加了开发效率

拓展:将forEach封装到Array的原型链中,让所有数组都能使用新的forEach

let arr = [1, 2, 3, 4, 7, 8]

Array.prototype.newForEach = function(fn) {
    for (let i = 0; i < this.length; i++) {
        fn(this[i], i, this)
    }
}
arr.newForEach((item, index, arr) => {
    console.log(item, index, arr)
})

 


Part 2  将函数作为返回值

如果将函数作为返回值,本质上就是通过一个函数生成一个新的函数

// 高阶函数-函数作为返回值

 function makeFn() {
     let msg = 'hello function'
     return function() {
        console.log(msg)
    }
 }

 const fn = makeFn()
 fn()

 makeFn()()


//'hello function'

 实现once 只执行一次的事件

// once 函数 只会执行一次的事件

function once(fn) {
    // 定义一个标记  若done为false说明函数还没有执行,如果为true说明函数已经执行过一次了
    let done = false
    return function() {
        if (!done) {
            done = true
            return fn.apply(this, arguments)
        }
    }
}

let pay = once((money) => {
    console.log(`支付了:${money}元钱`)
})

pay(5)
pay(6)
pay(7)
pay(8)
pay(9)
pay(10)

即使多次调用,也只执行了一次fn 


Part 3 高阶函数的意义

函数式编程的思想:将运算过程进行抽象,屏蔽细节,只关注我们的目标,例如参数和结果

// 面向过程的方式

let array = [1,2,3,4]
for(let i = 0; i<array.length;i++){
    console.log(array[i])
}



// 函数式编程-高阶函数


let arr = [1, 2, 3, 4, 7, 8]

forEach(arr, function(item) {
    console.log(item)
})

高阶函数可以让我们更少的关注方法的细节从而实现结果

让我们的代码更简洁,复用性更高

以上是关于前端学习之函数式编程—高阶函数的主要内容,如果未能解决你的问题,请参考以下文章

前端学习之函数式编程—函数式编程概念+头等函数

前端学习之函数式编程—闭包

前端学习之函数式编程—柯里化

前端学习之函数式编程—纯函数

python学习之4函数式编程(廖雪峰)

python学习之第三天