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实现点击文字后变成文本框且可修改
Sep 21 Javascript
javascript计时器事件使用详解
Jan 07 Javascript
jQuery中:file选择器用法实例
Jan 04 Javascript
基于jQuery实现仿淘宝套餐选择插件
Mar 04 Javascript
JQuery球队选择实例
May 18 Javascript
JavaScript实现动态删除列表框值的方法
Aug 12 Javascript
详解网站中图片日常使用以及优化手法
Jan 09 Javascript
jQuery实现的页面遮罩层功能示例【测试可用】
Oct 14 jQuery
JavaScript事件对象event用法分析
Jul 27 Javascript
vue自定义tap指令及tap事件的实现
Sep 18 Javascript
vue组件创建的三种方式小结
Feb 03 Javascript
解决vue动态下拉菜单 有数据未反应的问题
Aug 06 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
火车采集器 免费版使出收费版本功能实现原理
2009/09/17 PHP
PHP stream_context_create()作用和用法分析
2011/03/29 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
2013/07/01 PHP
php实现水仙花数示例分享
2014/04/03 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
thinkPHP3.1验证码的简单实现方法
2016/04/22 PHP
PHP的curl函数的用法总结
2019/02/14 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
js验证模型自我实现的具体方法
2013/06/21 Javascript
JavaScript访问字符串中单个字符的两种方法
2015/07/03 Javascript
js读取并解析JSON类型数据的方法
2015/11/14 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
2016/12/18 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
easyui-edatagrid.js实现回车键结束编辑功能的实例
2017/04/12 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
2018/11/28 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
2019/05/22 Javascript
原生js+canvas实现贪吃蛇效果
2020/08/02 Javascript
python实现向ppt文件里插入新幻灯片页面的方法
2015/04/28 Python
Python找出9个连续的空闲端口
2016/02/01 Python
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
python实现QQ邮箱/163邮箱的邮件发送
2019/01/22 Python
Django使用Jinja2模板引擎的示例代码
2019/08/09 Python
win10环境下配置vscode python开发环境的教程详解
2019/10/16 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
Spring http服务远程调用实现过程解析
2020/06/11 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
2020/06/16 Python
详解CSS3弹性伸缩盒
2020/09/21 HTML / CSS
大一学生的职业生涯规划书范文
2014/01/19 职场文书
高三生物教学反思
2014/01/25 职场文书
高一数学教学反思
2014/02/07 职场文书
工伤事故赔偿协议书(标准)
2014/09/29 职场文书
2015新年寄语(一句话)
2014/12/08 职场文书
学校运动会开幕词
2016/03/03 职场文书
JS Object构造函数之Object.freeze
2021/04/28 Javascript
使用CSS3实现按钮悬停闪烁动态特效代码
2021/08/30 HTML / CSS