函数式编程一:js模拟高阶函数

什么是高阶函数

高阶函数(Higher-order function)
-可以把函数做为参数传给另一个函数。
-可以把函数做为另一个函数的返回结果。

一、把函数做为参数传给另一个函数。模拟forEach

function forEach(array, fn) {
    for (let i = 0; i < array.length; i++) {
        fn(array[i]);
    }
}
//测试
let arr = [1, 2, 3, 4];
forEach(arr, function(item) {
    console.log(item)
})

再来一个例子加深一下印象,模拟filter。


function filter(array, fn) {
    let results = [];
    for (let i = 0; i < array.length; i++) {
        if (fn(array[i])) {
            results.push(i);
        }
    }
    return results;
}
//测试
let arr = [1, 2, 3, 4];
filter(arr, function(item) {
    return item % 2 === 0;
})

二、把函数做成另一个函数的返回结果。
首先我们来模仿个once函数,只可被调用一次。

function once(fn) {
    let done = false;
    return function() {
        if (!done) {
            done = true;
            return fn.apply(this,arguments);
        }
    }
}
//测试
let pay=once(function(money){
    console.log(`支付:${money}元`)
})
pay(5);
pay(5);
pay(5);

上面例子不管pay被调用了多少次,只有第一次有效。

高阶函数的意义
说了这么多高阶函数到底有哪些意义呢?
一、抽象可以帮我们蒙蔽细节,只需要关注我们的目标。
二、高阶函数是用来抽象通用的问题
常用的高阶函数有:

  • forEach
  • map
  • filter
  • every
  • some
  • find/findIndex
  • reduce
  • sort

最后再给大家模拟两个常用的高阶函数
模拟map

const map = (array, fn) => {
        let results = [];
        for (let value of array) {
            results.push(fn(value));
        }
        return results
    }
    //测试
let arr = [1, 2, 3, 4];
arr = map(arr, v => v * v);
console.log(arr);

模拟every

const every = (array, fn) => {
    let result = true;
    for (let value of array) {
        result = fn(value);
        if (!result) {
            break
        }
    }
    return result
}

//测试
let arr = [11, 12, 14];
let r = every(arr, v => v > 10);
console.log(r)
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值