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 相关文章推荐
Iframe自适应高度绝对好使的代码 兼容IE,遨游,火狐
Jan 27 Javascript
jquery checkbox实现单选小例
Nov 27 Javascript
js跑步算法的实现代码
Dec 04 Javascript
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
Dec 15 Javascript
web前端开发JQuery常用实例代码片段(50个)
Aug 28 Javascript
浅谈箭头函数写法在ReactJs中的使用
Aug 22 Javascript
如何将HTML字符转换为DOM节点并动态添加到文档中详解
Aug 19 Javascript
JavaScript日期工具类DateUtils定义与用法示例
Sep 03 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
Jun 06 jQuery
解决vue打包后vendor.js文件过大问题
Jul 03 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
Sep 10 Javascript
Vue使用自定义指令实现拖拽行为实例分析
Jun 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
服务器上配置PHP运行环境教程
2015/02/12 PHP
解决Laravel blade模板转义html标签的问题
2019/09/03 PHP
Javascript selection的兼容性写法介绍
2013/12/20 Javascript
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
2013/12/29 Javascript
js取模(求余数)隔行变色
2014/05/15 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
2014/06/13 Javascript
5款JavaScript代码压缩工具推荐
2014/07/07 Javascript
常用的JS验证和函数汇总
2014/12/23 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
基于jquery实现的树形菜单效果代码
2015/09/06 Javascript
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
2016/07/07 Javascript
jQuery实现简洁的轮播图效果实例
2016/09/07 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
2017/03/29 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
Vue-cropper 图片裁剪的基本原理及思路讲解
2018/04/17 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
Node.js如何对SQLite的async/await封装详解
2019/02/14 Javascript
js实现列表向上无限滚动
2020/01/13 Javascript
js里面的变量范围分享
2020/07/18 Javascript
解决antd Form 表单校验方法无响应的问题
2020/10/27 Javascript
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
Python用模块pytz来转换时区
2016/08/19 Python
CentOS中升级Python版本的方法详解
2017/07/10 Python
Python正则表达式非贪婪、多行匹配功能示例
2017/08/08 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
解决yum对python依赖版本问题
2019/07/05 Python
python的命名规则知识点总结
2019/10/04 Python
体育学院毕业生自荐信
2013/11/03 职场文书
读书伴我成长演讲稿
2014/05/07 职场文书
工程合作意向书范本
2015/05/09 职场文书
2015年学校团委工作总结
2015/05/26 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
Python+Matplotlib+LaTeX玩转数学公式
2022/02/24 Python
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android