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 select下拉框操作的一些说明
Apr 02 Javascript
JQuery操作tr和td内容的方法实例
Mar 06 Javascript
通过$(this)使用jQuery包装后的方法或属性
May 18 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
Feb 23 Javascript
node.js 动态执行脚本
Jun 02 Javascript
JSONP原理及简单实现
Jun 08 Javascript
js控制按钮,防止频繁点击响应的实例
Feb 15 Javascript
JavaScript mixin实现多继承的方法详解
Mar 30 Javascript
浅谈React组件之性能优化
Mar 02 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
Mar 05 Javascript
vue-router传递参数的几种方式实例详解
Nov 13 Javascript
微信小程序 导入图标实现过程详解
Oct 11 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预定义常量
2006/12/25 PHP
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
phpize的深入理解
2013/06/03 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
laravel实现批量更新多条记录的方法示例
2017/10/22 PHP
使用javascript访问XML数据的实例
2006/12/27 Javascript
js表数据排序 sort table data
2009/02/18 Javascript
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
javascript计时器事件使用详解
2014/01/07 Javascript
教你如何在Node.js中使用jQuery
2016/08/28 Javascript
基于Vue2的移动端开发环境搭建详解
2016/11/03 Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
2017/08/30 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
JavaScript创建对象的常用方式总结
2018/08/10 Javascript
vue+element实现打印页面功能
2019/05/20 Javascript
小程序中canvas的drawImage方法参数使用详解
2019/07/04 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
Django自定义manage命令实例代码
2018/02/11 Python
Python学生信息管理系统修改版
2018/03/13 Python
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
python批量图片处理简单示例
2019/08/06 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
Python原始套接字编程实例解析
2020/01/29 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
深入理解HTML的FormData对象
2016/05/17 HTML / CSS
俄罗斯游戏商店:Buka
2020/03/01 全球购物
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
生产主管岗位职责
2013/11/10 职场文书
化学教学随笔感言
2014/02/19 职场文书
机修工工作职责
2014/02/21 职场文书
销售顾问岗位职责
2014/02/25 职场文书
网站美工岗位职责
2014/04/02 职场文书
公司年终奖分配方案
2014/06/16 职场文书
项目申请汇报材料
2014/08/16 职场文书
Python机器学习之基础概述
2021/05/19 Python
python中pandas对多列进行分组统计的实现
2021/06/18 Python