Skip to content

功能强大的高阶函数

其实我们在日常的开发中,经常会用到高阶函数,例如:mapfilterreduce等等。它们的强大相信大家都毋庸置疑,但大家是否自己写过高阶函数呢?如果没有的话,可以尝试写一写。

高阶函数的定义

高阶函数是 JavaScript 中一种重要的编程概念,它指的是可以接受一个或多个函数作为参数,或者返回一个函数的特殊函数。这种特性使得高阶函数在代码复用、抽象化以及函数组合方面表现出色,同时提升了代码的灵活性和可维护性。

高阶函数的核心特点

接收函数作为参数:例如Array.prototype.map方法,通过传递一个回调函数来处理数组中的每个元素,并生成新的数组。

js
const numbers = [1, 2, 3]
const doubled = numbers.map((num) => num * 2)
console.log(doubled) // 输出: [2, 4, 6]

返回函数作为结果:如创建加法器的例子,通过闭包实现动态函数的生成。

js
function createAdder(x) {
  return function (y) {
    return x + y
  }
}
const add5 = createAdder(5)
console.log(add5(3)) // 输出: 8

工作中实现案例

例如下面这个upsert函数,主要用来插入和更新用户信息。通过传递函数进去接收旧对象,返回新对象的操作,让调用这个函数时不用去纠结用户是否已经存在,只需要将参数传递即可,大大提高了函数的可复用性。

js
upsert(user: PlayerItem, callback: (oUser: PlayerItem) => PlayerItem) {
    const { userId } = user;
    const isExist = this.mPlayerMap.has(userId);
    if (isExist) {
        const nUser = callback(this.mPlayerMap.get(userId)!);
        this.update(nUser);
    } else {
        this.insert(user);
    }
}

传入回调函数,当用户已经存在时触发,函数接收旧的用户信息,将旧信息中的giftCount(送礼次数)更新,更新完再返回给upsert函数内部进行后面的操作。

js
upsert(user, (oUser: PlayerItem) => {
    oUser.giftCount += user.giftCount;
    return oUser;
});