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 相关文章推荐
JQuery选择器特辑 详细小结
May 14 Javascript
js实现div闪烁原理及实现代码
Jun 24 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
Jul 02 Javascript
Firefox下无法正常显示年份的解决方法
Sep 04 Javascript
超实用的JavaScript表单代码段
Feb 26 Javascript
iview给radio按钮组件加点击事件的实例
Sep 30 Javascript
vue.js  父向子组件传参的实例代码
Oct 29 Javascript
Bootstrap 树控件使用经验分享(图文解说)
Nov 06 Javascript
手写Node静态资源服务器的实现方法
Mar 20 Javascript
js canvas实现橡皮擦效果
Dec 20 Javascript
Vue发布项目实例讲解
Jul 17 Javascript
微信小程序单选框自定义赋值
May 26 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 xfocus防注入资料
2008/04/27 PHP
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
PHP 转义使用详解
2013/07/15 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
PHP树-不需要递归的实现方法
2016/06/21 PHP
php 使用fopen函数创建、打开文件详解及实例代码
2016/09/24 PHP
thinkPHP框架实现类似java过滤器的简单方法示例
2018/09/05 PHP
身份证号码前六位所代表的省,市,区, 以及地区编码下载
2007/04/12 Javascript
JS中的substring和substr函数的区别说明
2013/05/07 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
JS操作HTML自定义属性的方法
2015/02/10 Javascript
jQuery向后台传入json格式数据的方法
2015/02/13 Javascript
JavaScript的事件代理和委托实例分析
2015/03/25 Javascript
jQuery控制元素显示、隐藏、切换、滑动的方法总结
2015/04/16 Javascript
Javascript获取图片原始宽度和高度的方法详解
2016/09/20 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
jQuery实现拖动效果的实例代码
2017/06/25 jQuery
Vue中正确使用jQuery的方法
2017/10/30 jQuery
vue非父子组件通信问题及解决方法
2018/06/11 Javascript
vue通过数据过滤实现表格合并
2020/11/30 Javascript
vue+element表格导出为Excel文件
2019/09/26 Javascript
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
videocapture库制作python视频高速传输程序
2013/12/23 Python
python操作 hbase 数据的方法
2016/12/18 Python
Python Pandas分组聚合的实现方法
2019/07/02 Python
python定义类self用法实例解析
2020/01/22 Python
Python如何使用ElementTree解析xml
2020/10/12 Python
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
初中三年毕业生的自我评价分享
2014/02/14 职场文书
幼儿园父亲节活动方案
2014/03/11 职场文书
培训讲师岗位职责
2014/04/13 职场文书
会计求职自荐信范文
2015/03/04 职场文书
关于开学的感想
2015/08/10 职场文书
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android