js函数式编程基础:高阶函数、柯理化、函数合成、Loadash

一、函数式编程

什么是函数式编程(FP)?

  1. FP是一种编程范式,也是一种编程风格,和面向对象是并列的关系。
  2. FP用于描述数据或函数之间的映射;根据输入通过某种运算获得相应的输出,即映射关系,例如:y=sin(x)。
  3. FP需要有输入和输出,相同的输入有相同的输出(这种称之为纯函数)。所以我们可以利用这个特点重用该函数,达到代码重用的目的。

函数式编程的常见应用场景

  • ES6中的map、filter、some等高阶函数。
  • React的高阶组件使用了高阶函数来实现,高阶函数就是函数式编程的一个特性。Redux也使用了函数式编程的思想。
  • Vue3也开始拥抱函数式编程,Vue2中也有一些高阶函数。
  • Webpack打包过程中利用tree shaking过滤无用代码。
  • 有很多库可以帮助我们进行函数式开发:lodash、underscore、ramda。

函数式编程的好处

  • 综合高阶函数、纯函数、柯理化、函数组合等好处

二、高阶函数

什么是高阶函数?高阶函数有以下几种特性:

  • 函数作为变量(函数是一等公民特性)
  • 函数作为参数,例如:map、filter、some等(高阶函数特性)
  • 函数作为返回值,例如:闭包、节流、防抖函数等 (高阶函数特性)

使用高阶函数的好处?

  • 高阶函数可以帮助我们重用、抽象一些过程代码,让代码复用率更高

常用的高阶函数?

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

例如:map、some、函数节流与防抖等

const map = (array, fn) => {
    
    let results = [] 
    for (const value of array) {
    
        results.push(fn(value)) 
    }
    return results 
}

// test
let arr = [1, 2, 3, 4]
arr = map(arr, v => v * v)
console.log(arr)
// some 判断数组中是否有一个元素满足我们指定的条件,满足是true,都不满足为false
const some = (array, fn) => {
    
    let result = false 
    for (const value of array) {
   
        result = fn(value) 
        // 如果有一个元素不满足就直接跳出循环
        if (result) {
    
            break 
        }
    }
    return result
}

// test
let arr = [1, 3, 4, 9]
let arr1 = [1, 3, 5, 9]
let r = some(arr, v => v % 2 === 0)
console.log(r) // true
r = some(arr1, v => v % 2 === 0)
console.log(r) // false
// once
// 函数节流,让函数只执行一次
function once(fn) {
   
    let done = false
    return function() {
   
        // 判断值有没有被执行,如果是false表示没有执行,如果是true表示已经执行过了,不必再执行
        if(!done) {
   
            done = true
            // 调用fn,当前this直接传递过来,第二个参数是把fn的参数传递给return的函数
            return fn.apply(this, arguments)
        }
    }
}

// test
let pay = once(function (money) {
   
    console.log(`支付:${
     money} RMB`)
})

pay(5) //支付:5 RMB
pay(5)
pay(5)
pay(5)
pay(5)

三、纯函数

什么是纯函数?

  • 相同的输入有相同的输出而且没有副作用,常见的纯函数slice
  • 纯函数必须要有输入输出
let numbers = [1, 2, 3, 4, 5] 
// 纯函数 
// 对于相同的函数,输出是一样的

// slice方法,截取的时候返回截取的函数,不影响原数组
numbers.slice(0, 3) // => [1, 2, 3] 
numbers.slice(0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值