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 相关文章推荐
用Javscript实现表单复选框的全选功能
May 25 Javascript
解析Javascript中大括号“{}”的多义性
Dec 02 Javascript
JavaScript实现班级随机点名小应用需求的具体分析
May 12 Javascript
jquery右下角自动弹出可关闭的广告层
May 08 Javascript
jQuery自定义滚动条完整实例
Jan 08 Javascript
浅谈Cookie的生命周期问题
Aug 02 Javascript
layui弹出层效果实现代码
May 19 Javascript
JS点击缩略图整屏居中放大图片效果
Jul 04 Javascript
jquery拖动改变div大小
Jul 04 jQuery
获取本机IP地址的实例(JavaScript / Node.js)
Nov 24 Javascript
在create-react-app中使用css modules的示例代码
Jul 31 Javascript
Vue引入Stylus知识点总结
Jan 16 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输出表格的实现代码(修正版)
2010/12/29 PHP
JpGraph php柱状图使用介绍
2011/08/23 PHP
使用php记录用户通过搜索引擎进网站的关键词
2014/02/13 PHP
php版微信小店API二次开发及使用示例
2016/11/12 PHP
非常好的js代码
2006/06/27 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
2011/07/27 Javascript
jQuery实现冻结表格行和列
2015/04/29 Javascript
又一款js时钟!transform实现时钟效果
2016/08/15 Javascript
原生js实现移动端Touch轮播图的方法步骤
2019/01/03 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
2019/04/19 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
JavaScript生成一个不重复的ID的方法示例
2019/09/16 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
2019/09/28 Javascript
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
2017/07/24 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
Python实现字符串匹配算法代码示例
2017/12/05 Python
Python实现读取txt文件并画三维图简单代码示例
2017/12/09 Python
python文件转为exe文件的方法及用法详解
2019/07/08 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
2019/10/14 Python
浅析python redis的连接及相关操作
2019/11/07 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
python设置环境变量的作用整理
2020/02/17 Python
logging level级别介绍
2020/02/21 Python
python中字符串的编码与解码详析
2020/12/03 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
印度第一网上礼品店:IGP.com
2020/02/06 全球购物
职业生涯规划书前言
2014/04/15 职场文书
小学教师培训方案
2014/06/09 职场文书
机关党员三严三实心得体会
2014/10/13 职场文书
董事长开业致辞
2015/07/29 职场文书
装修公司管理制度
2015/08/05 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
Python获取字典中某个key的value
2022/04/13 Python