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还原含有rowspan、colspan的table的实现方法
Feb 10 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
Jan 27 Javascript
20行代码实现的一个CSS覆盖率测试脚本
Jul 07 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
Sep 01 Javascript
js实现商城星星评分的效果
Dec 29 Javascript
jQuery 跨域访问解决原理案例详解
Jul 09 Javascript
JavaScript实现广告弹窗效果
Aug 09 Javascript
jQuery元素选择器实例代码
Feb 06 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
Feb 09 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
Feb 23 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
Jan 03 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
Oct 24 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
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
PHP注释语法规范与命名规范详解篇
2018/01/21 PHP
JavaScript开发时的五个注意事项
2007/12/08 Javascript
FLASH 广告之外的链接
2008/12/16 Javascript
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
2014/12/19 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
使用RequireJS库加载JavaScript模块的实例教程
2016/06/06 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
2016/11/21 Javascript
vue-cli3.0 特性解读
2018/04/22 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
策略模式实现 Vue 动态表单验证的方法
2019/09/16 Javascript
JQuery省市联动效果实现过程详解
2020/05/08 jQuery
Vue SPA 首屏优化方案
2021/02/26 Vue.js
[58:25]VP vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python生成随机密码
2015/03/10 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
Python编写Windows Service服务程序
2018/01/04 Python
基于anaconda下强大的conda命令介绍
2018/06/11 Python
Python基于百度云文字识别API
2018/12/13 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
将labelme格式数据转化为标准的coco数据集格式方式
2020/02/17 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
纯css3实现图片翻牌特效
2015/03/10 HTML / CSS
基于HTML5 Canvas 实现弹出框效果
2017/06/05 HTML / CSS
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
创业计划书如何编写
2014/02/06 职场文书
《天安门广场》教学反思
2014/04/23 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书