首页 > 其他分享 >6.手写函数柯里化工具函数、并理解其应用场景和优势

6.手写函数柯里化工具函数、并理解其应用场景和优势

时间:2023-03-05 09:44:05浏览次数:48  
标签:function return 函数 参数 柯里化 手写 fn

手写函数柯里化工具函数、并理解其应用场景和优势

什么是柯里化(Curring)???

什么意思?简单来说,柯里化是一项技术,它用来改造多参数的函数。

 

 

简单讲就是把一个多参数的函数f,变换成接受部分参数的函数g,并且这个函数g会返回一个函数h,函数h用来接受其他参数。函数h可以继续柯里化。就是一个套娃的过程~

2.柯里化的作用和特点

2.1参数复用

工作中会遇到的需求:通过正则校验电话号、邮箱、身份证是否合法等等

于是我们会封装一个校验函数如下

function checkByRegExp(regExp, str) {
    return regExp.test(str)
}

但是我们要检验很多手机号、邮箱,所以我们要调用和多次

// 校验手机号
checkByRegExp(/^1\d{10}$/, '15152525634'); 
checkByRegExp(/^1\d{10}$/, '13456574566'); 
checkByRegExp(/^1\d{10}$/, '18123787385'); 
// 校验邮箱
checkByRegExp(/^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/, '[email protected]'); 
checkByRegExp(/^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/, '[email protected]'); 
checkByRegExp(/^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/, '[email protected]');

尝试用柯里化来改进

function checkByRegExp(regExp) {
    return function(str) {
        return regExp.test(str)
    }
}

// 校验手机
const checkPhone = curryingCheckByRegExp(/^1\d{10}$/)
// 校验邮箱
const checkEmail = curryingCheckByRegExp(/^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/)

// 校验手机号
checkPhone('15152525634'); 
checkPhone('13456574566'); 
checkPhone('18123787385'); 
// 校验邮箱
checkEmail('[email protected]'); 
checkEmail('[email protected]'); 
checkEmail('[email protected]');
这就是参数复用

2.2 提前返回

有的浏览器不支持addeventlistener 需要判断一下是否使用attachEventListener

但是有时候浏览器一旦确立下来,就不需要这样了判断了

每次都判断效率很低

柯里化处理

function curryingAddEvent() {
    if (window.addEventListener) {
        return function(element, type, fn, isCapture) {
            element.addEventListener(type, fn, isCapture)
        }
    } else if (window.attachEvent) {
        return function(element, type, fn) {
            element.attachEvent("on" + type, fn)
        }
    }
}
const addEvent = curryingAddEvent()

// 也可以用立即执行函数将上述代码合并
const addEvent = (function curryingAddEvent() {
  ...
})()

2.3延迟执行

 

 

3.手写通用柯里化函数

const currying = function(fn, ...args) {
    // fn需要的参数个数
    const len = fn.length
    // 返回一个函数接收剩余参数
    return function (...params) {
        // 拼接已经接收和新接收的参数列表
        let _args = [...args, ...params]
        // 如果已经接收的参数个数还不够,继续返回一个新函数接收剩余参数
        if (_args.length < len) {
            return currying.call(this, fn, ..._args)
        }
       // 参数全部接收完调用原函数
        return fn.apply(this, _args)
    }
}

 

优势

  1. 柯里化突出一种重要思想:降低适用范围,提高适用性
  2. 柯里化的三个作用和特点:参数复用、提前返回、延迟执行
  3. 柯里化是闭包的一个典型应用,利用闭包形成了一个保存在内存中的作用域,把接收到的部分参数保存在这个作用域中,等待后续使用。并且返回一个新函数接收剩余参数

 

注意函数的length就是函数的形参个数

 

标签:function,return,函数,参数,柯里化,手写,fn
From: https://www.cnblogs.com/alwaysrun/p/17179830.html

相关文章

  • STATA:字符串处理函数收集
    //*命令subinstr(S1,S2,S3,n),n表示迭代的次数,S1是变量,S2是需要替代的变量,S3是新替换的变量。如果n是.代表所有的都换*///reverse()字符串逆顺localwjm="`c(current_t......
  • day3函数
    """函数的概念:S=πr²,当我们知道半径r的值时,就可以通过公式计算出面积,假设我们需要计算3个不同大小的圆的面积:出现了几乎完全重复的代码,每次计算圆的面积的......
  • SQL中只要用到聚合函数就一定要用到group by 吗?
    今天记录一个弱智问题,一直没发现这个问题。答:看情况1、当聚集函数和非聚集函数出现在一起时,需要将非聚集函数进行groupby2、当只做聚集函数查询时候,就不需要进行分组了......
  • 数论学习笔记2:数论函数
    积性函数定义积性函数是满足\(\forallu\perpv,f(uv)=f(u)f(v)\)的数论函数,\(f(1)\)总是等于\(1\)。求值由定义可知,积性函数在全体正整数处的取值由其在\(p^k\)......
  • ES6-ES11 生成器函数的实例(解决回调地狱问题)
    原视频<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><titl......
  • ES6-ES11 生成器函数声明与调用
    原视频<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title......
  • Excel批量插入图片(Excel函数集团)
    批量插入图片,归函数集团管了?对,你没看错,就是函数集团的活!因为Microsoft365出了一个新函数:IMAGE!所以,以前折腾的那种一堆合并以后再贴进txt文本文件再贴回来的,没用了?是与......
  • excel常用函数整理(可检索)
    目录:一、数字函数1.1sum1.2sumif1.3sumifs1.4sumproduct1.5abs二、统计函数2.1count2.2counta2.3countif2.4countifs2......
  • numpy深度学习常用函数及参数理解(axis, keepdims)
    axis:以axis=0为例,则沿着第0个下标(最左边的下标)变化的方向进行操作,也就是将除了第0个下标外,其他两个下标都相同的部分分成一组,然后再进行操作例如一个3*3的二维数组A(3,......
  • 手写一个发布订阅(EventEmitter)
    1.直接贴代码classEventEmitter{constructor(){this.events={};}events:Record<string,Function[]>on(eventName:string,func:Function){......