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图片倾斜层叠切换特效代码分享
Aug 27 Javascript
javascript中Date format(js日期格式化)方法小结
Dec 17 Javascript
vuejs2.0实现一个简单的分页示例
Feb 22 Javascript
vue监听滚动事件实现滚动监听
Apr 11 Javascript
原生js二级联动效果
Jun 20 Javascript
jQuery模拟爆炸倒计时功能实例代码
Aug 21 jQuery
canvas+gif.js打造自己的数字雨头像的示例代码
Oct 26 Javascript
Vue实现内部组件轮播切换效果的示例代码
Apr 07 Javascript
React Native基础入门之调试React Native应用的一小步
Jul 02 Javascript
JS根据json数组多个字段排序及json数组常用操作
Jun 06 Javascript
在layui.use 中自定义 function 的正确方法
Sep 16 Javascript
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
Apr 19 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
AM/FM收音机的安装与调试
2021/03/02 无线电
解析php防止form重复提交的方法
2013/07/01 PHP
php foreach循环中使用引用的问题
2013/11/06 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
php中file_exists函数使用详解
2015/05/08 PHP
学习php设计模式 php实现桥梁模式(bridge)
2015/12/07 PHP
yii使用activeFileField控件实现上传文件与图片的方法
2015/12/28 PHP
Laravel网站打开速度优化的方法汇总
2017/07/16 PHP
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
js将控件隐藏的方法及display属性介绍
2013/07/04 Javascript
jquery根据name属性查找的小例子
2013/11/21 Javascript
JS window对象的top、parent、opener含义介绍
2013/12/03 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
jquery插件corner实现圆角边框的方法
2015/03/09 Javascript
Vue学习笔记进阶篇之单元素过度
2017/07/19 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
Vue时间轴 vue-light-timeline的用法说明
2020/10/29 Javascript
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
python 实现UTC时间加减的方法
2018/12/31 Python
Python实用工具FuckIt.py介绍
2019/07/02 Python
Python八皇后问题解答过程详解
2019/07/29 Python
学习和使用python的13个理由
2019/07/30 Python
解决python中的幂函数、指数函数问题
2019/11/25 Python
Python startswith()和endswith() 方法原理解析
2020/04/28 Python
YSL圣罗兰美妆美国官网:Yves Saint Lauret US
2016/11/21 全球购物
潘多拉珠宝俄罗斯官方网上商店:PANDORA俄罗斯
2020/09/22 全球购物
凌阳科技股份有限公司C++程序员面试题笔试题
2014/11/20 面试题
什么是继承
2013/12/07 面试题
硕士研究生自我鉴定
2013/11/08 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python
Python中递归以及递归遍历目录详解
2021/10/24 Python
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript
一次项目中Thinkphp绕过禁用函数的实战记录
2021/11/17 PHP
Springboot中如何自动转JSON输出
2022/06/16 Java/Android