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


Posted in Javascript onDecember 02, 2020

简介
当我们在读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

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

Javascript 相关文章推荐
jquery ui dialog里调用datepicker的问题
Aug 06 Javascript
js获取当月最后一天实例代码
Nov 19 Javascript
JavaScript中的操作符类型转换示例总结
May 30 Javascript
使用jquery实现的循环连续可停顿滚动实例
Nov 23 Javascript
基于JavaScript实现窗口拖动效果
Jan 18 Javascript
JavaScript实现星星等级评价功能
Mar 22 Javascript
ReactNative列表ListView的用法
Aug 02 Javascript
laravel5.4+vue+element简单搭建的示例代码
Aug 29 Javascript
React实践之Tree组件的使用方法
Sep 30 Javascript
详解基于node.js的脚手架工具开发经历
Jan 28 Javascript
微信小程序新手教程之页面打开数量限制
Mar 03 Javascript
解决VUE双向绑定失效的问题
Oct 29 Javascript
element-ui中el-upload多文件一次性上传的实现
Dec 02 #Javascript
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
Dec 02 #Vue.js
keep-alive保持组件状态的方法
Dec 02 #Javascript
vue组件中节流函数的失效的原因和解决方法
Dec 02 #Vue.js
Vue3+elementui plus创建项目的方法
Dec 01 #Vue.js
JS实现超级好看的鼠标小尾巴特效
Dec 01 #Javascript
echarts饼图各个板块之间的空隙如何实现
Dec 01 #Javascript
You might like
smtp邮件发送一例
2006/10/09 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
2014/06/26 PHP
PHP中使用php://input处理相同name值的表单数据
2015/02/03 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
ext combox 下拉框不出现自动提示,自动选中的解决方法
2010/02/24 Javascript
javascript基础知识大集锦(二) 推荐收藏
2011/01/13 Javascript
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
js仿支付宝多方框输入支付密码效果
2016/09/27 Javascript
js模式化窗口问题![window.dialogArguments]
2016/10/30 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
jQuery实现模糊搜索功能的方法分析
2018/06/29 jQuery
vue2 拖动排序 vuedraggable组件的实现
2019/08/08 Javascript
使用Python操作excel文件的实例代码
2017/10/15 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
python识别验证码的思路及解决方案
2020/09/13 Python
python中的测试框架
2020/11/13 Python
HTML5地理定位与第三方工具百度地图的应用
2016/11/17 HTML / CSS
英国男女奢华内衣和泳装购物网站:Figleaves
2017/01/28 全球购物
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
黄色火烈鸟:De Gele Flamingo
2019/03/18 全球购物
德国在线香料制造商:Gewürzland
2020/03/10 全球购物
房产销售经理职责
2013/12/20 职场文书
幼儿园教师教育感言
2014/02/28 职场文书
个人承诺书格式
2014/06/03 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
出售房屋协议书范本
2014/10/06 职场文书
人事行政助理岗位职责
2015/04/11 职场文书
辞职申请书范本
2019/05/20 职场文书
用Python远程登陆服务器的步骤
2021/04/16 Python
Python 发送SMTP邮件的简单教程
2021/06/24 Python