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 相关文章推荐
js/jQuery对象互转(快速操作dom元素)
Feb 04 Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
Jul 17 Javascript
JavaScript实现网站访问次数统计代码
Aug 12 Javascript
js编写的treeview使用方法
Nov 11 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
Aug 31 Javascript
vue、react等单页面项目应该这样子部署到服务器
Jan 03 Javascript
vue element项目引入icon图标的方法
Jun 06 Javascript
vue click.stop阻止点击事件继续传播的方法
Sep 04 Javascript
浅谈微信页面入口文件被缓存解决方案
Sep 29 Javascript
vue打包之后生成一个配置文件修改接口的方法
Dec 09 Javascript
JS实现分页导航效果
Feb 19 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
php array_walk() 数组函数
2011/07/12 PHP
利用PHP自动生成印有用户信息的名片
2016/08/01 PHP
利用php + Laravel如何实现部署自动化详解
2017/10/11 PHP
jQuery 剧场版 你必须知道的javascript
2009/05/27 Javascript
JavaScript修改css样式style动态改变元素样式
2013/12/16 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
javascript弹出页面回传值的方法
2015/01/28 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
基于jquery实现无限级树形菜单
2016/03/22 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
javascript实现根据函数名称字符串动态执行函数的方法示例
2016/12/28 Javascript
jQuery表格的维护和删除操作
2017/02/03 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
浅谈redux以及react-redux简单实现
2018/08/28 Javascript
深入了解query和params的使用区别
2019/06/24 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
ES6新增的数组知识实例小结
2020/05/23 Javascript
[04:40]2016国际邀请赛中国区预选赛全程TOP10镜头集锦
2016/07/01 DOTA
通过C++学习Python
2015/01/20 Python
python实现合并两个数组的方法
2015/05/16 Python
Python实现模拟时钟代码推荐
2015/11/08 Python
Python实现的双色球生成功能示例
2017/12/18 Python
Python实现获取前100组勾股数的方法示例
2018/05/04 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
值得收藏的HTML5资源(学习html5的朋友可以收藏下)
2010/07/20 HTML / CSS
html5的input的required使用中遇到的问题及解决方法
2018/04/24 HTML / CSS
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
小学科学教学反思
2014/01/26 职场文书
宗教学大学生职业生涯规划范文
2014/02/08 职场文书
项目合作协议书范本
2014/04/16 职场文书
学习雷锋活动总结
2014/04/29 职场文书
2014年安全管理工作总结
2014/12/01 职场文书
2015年仓管员工作总结
2015/04/21 职场文书