JavaScript函数柯里化原理与用法分析


Posted in Javascript onMarch 31, 2017

本文实例讲述了JavaScript函数柯里化原理与用法。分享给大家供大家参考,具体如下:

柯里化是这样的一个转换过程,把接受多个参数的函数变换成接受一个单一参数(译注:最初函数的第一个参数)的函数,如果其他的参数是必要的,返回接受余下的参数且返回结果的新函数。

也就是说是固定部分参数,返回一个接受剩余参数的函数,也称为部分计算函数,目的是为了缩小适用范围,创建一个针对性更强的函数。

例如,我想创建一个做自我介绍的函数,每个人只要输入自己姓名、性别、年龄即可。但是当A使用这个函数时,每次调用,都必须输入一次自己姓名、性别,实际只是年龄改变了而已,为此A会为自己生成一个柯里化的自我介绍函数,其中姓名和性别是固定参数。

相关代码请查看github.

function curry(fn){
  var args = Array.prototype.slice.call(arguments, 1);
  return function(){
    var innerArgs = Array.prototype.slice.call(arguments);
    var finalArgs = args.concat(innerArgs);
    return fn.apply(null, finalArgs);
  };
}
function selfIntroduction(name, gender, age){
  console.log('hi, I am ' + name + ', ' + age +' years old ' + '. I am a ' + gender + '.');
}
var curriedSelfIntroduction = curry(selfIntroduction, 'A', 'man');
curriedSelfIntroduction('12');
curriedSelfIntroduction('13');
curriedSelfIntroduction('14');

执行以后结果。

JavaScript函数柯里化原理与用法分析

当然,我们也可以写一个绑定新作用域的柯里化函数。

function curry(fn, context){
  var args = Array.prototype.slice.call(arguments, 2);
  return function(){
    var innerArgs = Array.prototype.slice.call(arguments);
    var finalArgs = args.concat(innerArgs);
    return fn.apply(context, finalArgs);
  };
}

尽管柯里化函数已经很牛了,但是它也让你必须花费点小心思在你所定义函数的参数顺序上。函数柯里化允许和鼓励你分隔复杂功能变成更小更容易分析的部分。这些小的逻辑单元显然是更容易理解和测试的,然后你的应用就会变成干净而整洁的组合,由一些小单元组成的组合。所以如果你能恰当使用柯里化函数,会使得你的JS代码更优雅。

注意:建议你看一看ES6(ES2015)中的Proxy,这是另一种对函数进行预处理的方法。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript中json操作技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
自适应高度框架 ----属个人收藏内容
Jan 22 Javascript
js 通用javascript函数库整理
Aug 14 Javascript
javascript中scrollTop详解
Apr 13 Javascript
jquery点击缩略图切换视频播放特效代码分享
Sep 15 Javascript
jQuery通用的全局遍历方法$.each()用法实例
Jul 04 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
Jul 10 Javascript
vue中的非父子间的通讯问题简单的实例代码
Jul 19 Javascript
详解webpack4升级指南以及从webpack3.x迁移
Jun 12 Javascript
jQuery实现的中英文切换功能示例
Jan 11 jQuery
egg.js的基本使用和调用数据库的方法示例
May 18 Javascript
微信小程序实现图片上传
May 23 Javascript
vue 动态添加class,三个以上的条件做判断方式
Nov 02 Javascript
js实现一个猜数字游戏
Mar 31 #Javascript
微信小程序页面间通信的5种方式
Mar 31 #Javascript
ES6新特性之Symbol类型用法分析
Mar 31 #Javascript
微信小程序 后台登录(非微信账号)实例详解
Mar 31 #Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
Mar 31 #Javascript
ES6新特性之Object的变化分析
Mar 31 #Javascript
ES6新数据结构Set与WeakSet用法分析
Mar 31 #Javascript
You might like
简单的移动设备检测PHP脚本代码
2011/02/19 PHP
php存储过程调用实例代码
2013/02/03 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
php json转换相关知识(小结)
2018/12/21 PHP
php 使用mpdf实现指定字段配置字体样式的方法
2019/07/29 PHP
Thinkphp5.0 框架Model模型简单用法分析
2019/10/11 PHP
laravel orm 关联条件查询代码
2019/10/21 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
最常用的12种设计模式小结
2011/08/09 Javascript
JQueryEasyUI datagrid框架的基本使用
2013/04/08 Javascript
关闭浏览器时提示onbeforeunload事件
2013/12/25 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
2016/06/23 Javascript
jQuery Ajax请求后台数据并在前台接收
2016/12/10 Javascript
jquery+html仿翻页相册功能
2016/12/20 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
2017/02/24 Javascript
jquery实现左右轮播图效果
2017/09/28 jQuery
Koa2微信公众号开发之本地开发调试环境搭建
2018/05/16 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
JavaScript实现HTML导航栏下拉菜单
2020/11/25 Javascript
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
python 输出所有大小写字母的方法
2019/01/02 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
2020/03/27 Python
python 实现音频叠加的示例
2020/10/29 Python
python利用appium实现手机APP自动化的示例
2021/01/26 Python
德国大型箱包和皮具商店:Koffer
2019/10/01 全球购物
网上开店必备创业计划书
2014/01/26 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
无私奉献演讲稿
2014/09/04 职场文书
交通违章检讨书
2014/09/21 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
解约证明模板
2015/06/19 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书
Java 语言中Object 类和System 类详解
2021/07/07 Java/Android
LyScript实现绕过反调试保护的示例详解
2022/08/14 Python