JavaScript函数柯里化实现原理及过程

 更新时间:2020年12月02日 09:54:32   作者:王者归来!  
这篇文章主要介绍了JavaScript函数柯里化实现原理及过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

简介
当我们在读Vue源码到时候会发现,在它的 _update 实例中就用到了函数柯里化,(createPatchFunction方法)有兴趣的可以

去看一下。

柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

在《Mostly adequate guide》中,这样总结了 Currying ——只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

Currying 是函数式编程的一种实现,可以给我们的编程带来便利。那 Currying 函数到底长什么样呢?请往下看,我们根据它的概念自己来写一个柯里化函数

实现

// 如何实现 add(1,2) === add(1)(2)
let add = (...args) => {
  return args.length === 1 ? a => a + args[0] : args[0] + args[1]
}

这个似乎有一点接近柯里化的意思,但并不是真正的Currying,我们应该做到 add(1,2,3,,,) === currying(add)(1,2,3,,,) 才能算是真正的柯里化函数,OK,我们继续往下来,

let add = (...args) => args.reduce((a,b)=>a+b)
 
let currying = (fn)=>{
  return function(...args){
    return fn.apply(this, args)
  }
}
// add(1,2,3,,,) === currying(add)(1,2,3,,,)

还有人这么玩,可以参考下

let currying = (fn) => {
  var args = [].slice.call(arguments, 1)
  return function() {
    var newArgs = args.concat([].slice.call(arguments))
    return fn.apply(this, newArgs)
  }
}
 
let addCurry = currying(add, 1, 2);
addCurry() // 3
 
addCurry = currying(add, 1);
addCurry(2) // 3
 
addCurry = currying(add);
addCurry(1, 2) // 3

实际上这个实现方法利用闭包的原理,有时间给大家做个对比,

分析

可以看到,实际上柯里化函数并不算难,要想实际运用在我们的开发中,需要我们花点小心思~

参考:https://github.com/FIGHTING-TOP/FE-knowlodge-base/issues/4

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 如何使用big.js解决JavaScript浮点数精度丢失问题

    如何使用big.js解决JavaScript浮点数精度丢失问题

    最近在项目中涉及到金额从元转为分(乘100即可),发现乘法居然也会有精度丢失的问题,关于浮点数计算精度丢失是很多语言都存在的问题,本文给大家分享使用big.js解决JavaScript浮点数精度丢失问题,感兴趣的朋友一起看看吧
    2023-12-12
  • JS简单实现数组去重的方法示例

    JS简单实现数组去重的方法示例

    这篇文章主要介绍了JS简单实现数组去重的方法,涉及javascript数组的遍历、判断及赋值操作,代码非常简单易懂,具有一定参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • JS实现的贪吃蛇游戏案例详解

    JS实现的贪吃蛇游戏案例详解

    这篇文章主要介绍了JS实现的贪吃蛇游戏,结合具体案例形式分析了javascript实现贪吃蛇的相关步骤、原理、算法操作技巧与相关注意事项,需要的朋友可以参考下
    2019-05-05
  • JS判断一个数是否是水仙花数

    JS判断一个数是否是水仙花数

    水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。下面通过本文给大家分享JS判断一个数是否是水仙花数,需要的朋友参考下吧
    2017-06-06
  • 请求时token过期自动刷新token操作

    请求时token过期自动刷新token操作

    这篇文章主要介绍了请求时token过期自动刷新token操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • javascript表单验证 - Parsley.js使用和配置

    javascript表单验证 - Parsley.js使用和配置

    大家还记得我们曾经介绍过的表单验证jquery插件jquery.validationEngine吧;天介绍的Parsley同样也可以帮助你只使用简单的配置即可实现表单验证功能,基于它的强大DOM-API,感兴趣的你可以不要错过了哦
    2013-01-01
  • JavaScript数据类型转换实例(其他类型转字符串、数值型、布尔类型)

    JavaScript数据类型转换实例(其他类型转字符串、数值型、布尔类型)

    这篇文章主要给大家介绍了关于JavaScript数据类型转换的相关资料,本文分别介绍了其他类型转为字符串、其他类型转为数值型以及其他类型转为布尔类型的方法,需要的朋友可以参考下
    2021-07-07
  • 前端页面文件拖拽上传模块js代码示例

    前端页面文件拖拽上传模块js代码示例

    这篇文章主要为大家详细介绍了前端页面文件拖拽上传模块js代码示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • JavaScript设计模式之原型模式分析【ES5与ES6】

    JavaScript设计模式之原型模式分析【ES5与ES6】

    这篇文章主要介绍了JavaScript设计模式之原型模式,简单描述了原型模式的概念、原理,并结合实例形式分析了ES5与ES6实现原型模式的相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • JS 屏蔽按键效果与改变按键效果的示例代码

    JS 屏蔽按键效果与改变按键效果的示例代码

    本篇文章主要是对JS 屏蔽按键效果与改变按键效果的示例代码进行了进行,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-12-12

最新评论