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 相关文章推荐
Firefox下提示illegal character并出现乱码的原因
Mar 25 Javascript
基于Jquery的仿照flash放大图片效果代码
Mar 16 Javascript
jQuery实现平滑滚动的标签分栏切换效果
Aug 28 Javascript
js淡入淡出焦点图幻灯片效果代码分享
Sep 08 Javascript
JavaScript模拟鼠标右键菜单效果
Dec 08 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
May 12 Javascript
JS常用函数和常用技巧小结
Oct 15 Javascript
js 获取今天以及过去日期
Apr 11 Javascript
vue.js删除列表中的一行
Jun 30 Javascript
Vue配合iView实现省市二级联动的示例代码
Jul 27 Javascript
原生js实现移动端Touch轮播图的方法步骤
Jan 03 Javascript
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
May 13 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 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
百度ping方法使用示例 自动ping百度
2014/01/26 PHP
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
php文件下载处理方法分析
2015/04/22 PHP
使用Composer安装Yii框架的方法
2016/03/15 PHP
PHP构造二叉树算法示例
2017/06/21 PHP
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
JS实现字体选色板实例代码
2013/11/20 Javascript
javascript下使用Promise封装FileReader
2016/02/19 Javascript
使用jquery+iframe做一个ajax上传效果(实例)
2017/08/24 jQuery
ES6学习教程之对象字面量详解
2017/10/09 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
Vue3新特性之在Composition API中使用CSS Modules
2020/07/13 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
2020/08/04 Javascript
Python中应该使用%还是format来格式化字符串
2018/09/25 Python
浅谈Python 多进程默认不能共享全局变量的问题
2019/01/11 Python
python实现ip代理池功能示例
2019/07/05 Python
python调用接口的4种方式代码实例
2019/11/19 Python
CSS3实现瀑布流布局与无限加载图片相册的实例代码
2016/12/22 HTML / CSS
利用css3径向渐变做一张优惠券的示例
2018/03/22 HTML / CSS
3种方式实现瀑布流布局小结
2019/09/05 HTML / CSS
乌克兰时尚鞋子和衣服购物网站:Born2be
2018/05/24 全球购物
诺思信科技(南京)有限公司.NET笔试题答案
2013/07/06 面试题
求职简历自荐信
2013/10/20 职场文书
药物学专业学生的自我评价
2013/10/27 职场文书
新学期开学寄语
2014/01/18 职场文书
小学生春游活动方案
2014/08/20 职场文书
副乡长群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
学校组织向国旗敬礼活动方案(中小学适用)
2014/09/27 职场文书
2014保险公司内勤工作总结
2014/12/16 职场文书
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
2021/06/13 Python
Python自动化测试PO模型封装过程详解
2021/06/22 Python
vue 把二维或多维数组转一维数组
2022/04/24 Vue.js
mysql 排序失效
2022/05/20 MySQL
V Rising 服务器搭建图文教程
2022/06/16 Servers