简单理解柯里化

详解柯里化

前言

    函数柯里化是把接收多个参数的函数,转换成接收单一参数的函数,并且返回一个(可以接收剩余参数)新函数的技
    术。优点1:可以延迟计算,即调用柯里化函数传入的参数不是立即调用的,而是当满足一定条件的时候才会(将已
    经在数组中存储的参数作为参数)执行;优点2:参数复用,当在多次调用同一个函数,并且传递的参数绝大多数是
    相同的,那么该函数可能是一个很好的柯里化函数。

实现

  1. lodash中的curry方法就是一个柯里化函数 https://www.lodashjs.com/docs/lodash.curry
  2. 自己实现一个通用的柯里化函数
function sum(a,b,c,d) {
    return a + b + c + d;
}
const curring = (fn:Function) => {
        const exec = (sumArgs:any[] = []) => {
        return sumArgs.length >= fn.length ? fn(...sumArgs) 
      : (...args) => exec([...sumArgs,...args])
    }
    return exec()   //exec()的参数可以是初始化的值,可以是重复传递的参数
}
let test = curring(sum)(......)

场景

场景一:减少重复传递不变的参数(优点二)
1.实现url的拼接
如果我们要拼接一个URL,即协议+域名+路径,那么重复参数的情况就出现了,如协议是http还是https呢?如下:

function splicingUrl(protocol,domain,path){
        return `${protocol}://${domain}/${path}`
}
splicingUrl(http,www.baidu.com,home)
splicingUrl(https,taobao.com,datail)

所以我们可以通过柯里化减少重复参数的传递,那我们开始吧哈哈~

function splicingUrl(protocol,domain,path){
        return `${protocol}://${domain}/${path}`
}
const curryPackage = (fn:Function) => {
        const curryFunc = (splicingArgs:any[] = []) => {
            return splicingArgs.length >= fn.length ? fn(...splicingArgs) 
        : (...args) => curryFunc([...splicingArgs,...args])
    }
    return curryFunc()
}
let newCurry = curryPackage(splicingUrl)('http','www.baiducom')
newCurry('home.html')   //http://www.baiducom/home.html
newCurry('photo.html')  //http://www.baiducom/photo.html

场景二:将柯里化之后的callback参数传递给map,filter等函数

let studentsInfo = [{name:'tom',age:19},{name:'jarry',age:32},{name:'susan',age:33}]
function getObj(key,obj){
    return obj[key]
}
//将callback进行柯里化
import _ from 'lodash';
let curryCallback = _curry(getObj)
let nameArray = studentsInfo.map(curryCallback('name'));  // ['tom','jarry','susan']
let agesArray = studentsInfo.map(curryCallback('age'));   // [19,32,33]

当然还有很多场景,不一一列举了。可以帮助我们理解lodash中curry方法的原理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值