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 相关文章推荐
javascript 写类方式之七
Jul 05 Javascript
jquery.cvtooltip.js 基于jquery的气泡提示插件
Nov 19 Javascript
原生js和jQuery随意改变div属性style的名称和值
Oct 22 Javascript
Javascript堆排序算法详解
Dec 03 Javascript
JavaScript中getUTCSeconds()方法的使用详解
Jun 11 Javascript
基于JavaScript实现网页倒计时自动跳转代码
Dec 28 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
Aug 24 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
Jan 10 Javascript
BootStrapValidator初使用教程详解
Feb 10 Javascript
jQuery事件对象的属性和方法详解
Sep 09 jQuery
Node.Js生成比特币地址代码解析
Apr 21 Javascript
axios简单实现小程序延时loading指示
Jul 30 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/10/09 PHP
Mysql和网页显示乱码解决方法集锦
2008/03/27 PHP
php的大小写敏感问题整理
2011/12/29 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
2012/05/07 PHP
一个完整的php文件上传类实例讲解
2015/10/27 PHP
谈谈PHP连接Access数据库的注意事项
2016/08/12 PHP
php关联数组与索引数组及其显示方法
2018/03/12 PHP
PHP PDOStatement::nextRowset讲解
2019/02/01 PHP
IE6与IE7中,innerHTML获取param的区别
2009/03/15 Javascript
ExtJS 2.0 实用简明教程之布局概述
2009/04/29 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
Angular的模块化(代码分享)
2016/12/26 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
Vue过滤器的用法和自定义过滤器使用
2017/02/08 Javascript
JS简单获取日期相差天数的方法
2017/04/24 Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
2017/10/27 Javascript
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
用Vue.js在浏览器中实现裁剪图像功能
2019/06/18 Javascript
一篇超完整的Vue新手入门指导教程
2020/11/18 Vue.js
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
用Python制作简单的钢琴程序的教程
2015/04/01 Python
python实现猜拳游戏
2020/03/04 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
html5启动原生APP总结
2020/07/03 HTML / CSS
Lands’ End官网:经典的美国生活方式品牌
2016/08/14 全球购物
英国顶级水晶珠宝零售商之一:Tresor Paris
2019/04/27 全球购物
英语专业学生个人求职信
2014/01/28 职场文书
给老婆的道歉信
2015/01/20 职场文书
JavaScript事件的委托(代理)的用法示例详解
2022/02/18 Javascript
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技
TS 类型兼容教程示例详解
2022/09/23 Javascript