函数柯里化

纸飞机 发表于 2021/10/18 23:32:32 2021/10/18
【摘要】 柯里化(Currying)是一种函数转化方法,是 高阶函数(接收函数作为参数的函数)的一 种,它将一个接收多参数的函数转化为接 收部分参数的函数。柯里化后的函数只传 递部分参数来调用,并返回一个新的函数 去处理剩余的参数,是逐步传参的过程。 注:数学和理论计算机中的柯里化函数一次只能传递 一个参数,js实际应用中则可以传递一个或...

柯里化(Currying)是一种函数转化方法,是 高阶函数(接收函数作为参数的函数)的一 种,它将一个接收多参数的函数转化为接 收部分参数的函数。柯里化后的函数只传 递部分参数来调用,并返回一个新的函数 去处理剩余的参数,是逐步传参的过程。

注:数学和理论计算机中的柯里化函数一次只能传递 一个参数,js实际应用中则可以传递一个或多个参数。


  
  1. //普通函数
  2. function add(a, b, c) {
  3. return a + b + c;
  4. }
  5. add(1,2,3) //6
  6. //手动柯里化后的函数,其参数可以逐步单个传入,得到相同结果。
  7. function _add(a) {
  8. return function(b) {
  9. return function(c) {
  10. return a + b + c;
  11. }
  12. }
  13. }
  14. _add(1)(2)(3);//6

  
  1. //简单封装一个通用柯里化转化函数curry,将普通函数转化为柯里化的函数。
  2. 原理:用数组将参数收集起来,达到原函数形参个数就执行原函数,否则返回一个新函数继续接收新参数。
  3. function curry(fn, args) {
  4. //fn.length:形参个数,num为固定值
  5. var num = fn.length;
  6. var args = args || [];
  7. return function() {
  8. //arr用于收集传入的参数
  9. var arr =[].slice.call(argumerits);
  10. //将之前收集的参数加入arr
  11. [].push.apply(arr, args);
  12. //若参数小于num,递归调用继续收集参数
  13. if (arr.length < num) {
  14. return curry.call(this, fn, arr);
  15. }
  16. //参数达到num,则执行fn
  17. return fn.apply(this, arr);
  18. }
  19. }
  20. //此转化后的函数每次可以传入任意个参数
  21. var add_curried = curry(add)
  22. add_curried(1)(2)(3) //6
  23. add_curried(1,2)(3) //6
  24. add_curried(1)(2,3) //6
  25. add_curried(1,2,3) //6

  
  1. // 使用 lodash 库的—.curry
  2. $ npm i lodash --save
  3. const _= require('lodash')
  4. var abc = function(a,b,c) {
  5. return [a, b, c];
  6. };
  7. var curried = _.curry(abc);
  8. curried(1)(2)(3);
  9. //=> [1, 2,3]

柯里化作用

1.延时计算,又叫惰性求值。柯里化后的 函数是分步执行的,前几次调用均返回一 个函数,累积传入的参数,最后调用才会 计算,起到延时计算的作用。如bind函 数,改变this指向但并不执行,只返回函

2.固定易变因素。提前将易变因素传参 定下来,生成一个更明确的应用函数。

3.参数复用。当多次调用同一个函数,并 且传递的参数绝大多数是相同的时候。

4.动态创建函数。先完成部分传参, 创建新的函数返回,在需要的时候传入其余的参数调用执行。

文章来源: root181.blog.csdn.net,作者:前端纸飞机,版权归原作者所有,如需转载,请联系作者。

原文链接:root181.blog.csdn.net/article/details/119855673

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。