首页 > 其他分享 >函数柯里化实现sum函数

函数柯里化实现sum函数

时间:2022-10-23 22:44:31浏览次数:69  
标签:... 函数 sum 初始值 参数 柯里化 argArr

需求

实现sum函数,使其可以传入不定长参数,以及不定次数调用

//示例
console.log(sum(1,2)(3)())   //6
console.log(sum(2,3,4,5)(1,2)(3)(4)())    //23

需求分析

实现sum函数我们可以考虑可以使用闭包的形式来实现

  1. 因为每次传参,所以我们不知道这是不是最后一次,如果是最后一个括号,则就要执行

  2. 我们可以通过每次调用时对传入参数的个数来判断目前是否是最后一个括号

  3. 如果有参数就说明是调用,那么我们就将参数保存到外面的容器中

  4. 如果没有参数则说明是调用

  5. 如果最后是调用时,我们只需要将所有的参数累加即可

function add (...args) {
  return args.reduce((pre, cur) => pre + cur)
}
function currying (fn) {
  // 作为参数存储的容器
  let argArr = []
  // 中间容器,用来判断传入是否有传入参数
  return function temp (...arg) {
    // 只要传入的参数不为0,就继续将参数交给容器
    if (arg.length) {
      // 使用扩展运算符,将result中的值进行更新
      argArr = [...argArr, ...arg]
      return temp
    }
    // 如果没有参数的话则说明是最后一个括号,也就是执行
    else {
      let val = fn(...argArr)
      argArr = []
      return val
    }
  }
}

let sum = currying(add)
console.log(sum(1, 2, 3, 4)(1)())  //15
console.log(sum(1,2)(3)())  //6

reduce回顾

reduce数组方法,接收两个参数,第一个为一个累加器函数,第二个参数为初始值
比如对数组累加,我们如果不设置初始值,也就是不设置第二个参数,那么累加器中
第一个参数pre就是数组的第一个元素,cur就是第二个元素,也就是第一次就会访问到
数组的第一个和第二个元素
如果传递了初始值,那么数组索引就会从0开始,也就是第一个cur是数组第一个元素,
pre为传递的初始值
通俗一点来说:

如果不写初始值,那么元素累加就从索引为1开始,初始值默认为数组第一个元素
写上初始值就从索引为0开始。
累加函数有四个参数(preValue,curValue,index,arr)
每一项都要有一个返回值

闭包回顾

闭包的一般形式就是函数返回函数,在内层函数中可以访问外层函数中的变量
这样可以延长变量的作用域,使得变量可以长期保存。比如我们在这个案例中使用闭包
来保存每次传递的参数。闭包可能会造成内存泄露,其它造成内存泄漏的场景还有:

  • 没有被清理的定时器
  • 意外的全局变量
  • 没有清理对DOM的引用

标签:...,函数,sum,初始值,参数,柯里化,argArr
From: https://www.cnblogs.com/zx529/p/16819848.html

相关文章

  • 重温Excel基础函数(16):Column和Columns函数【获取列号和列数】
    1概念COLUMN函数是Excel中一个常用的函数,它可以用来返回参数单元格的列号。COLUMNS函数在Excel中的使用次数较少,它可以用来返回数组或引用的列数。注意这里是列数,不是列号。......
  • 重温Excel基础函数(15):Concatenate 函数【连接函数,相当于&】
    1概念使用CONCATENATE函数(其中一个文本函数)将两个或多个文本字符串联接为一个字符串。2语法语法:=CONCATENATE(text1, [text2],...)​参数名称说明 ①text1   (必需输入......
  • 重温Excel基础函数(14):Combin函数【返回指定数量元素的总组合数】
    1概念COMBIN函数返回指定数量元素的总组合数。可以指定组合元素数量。 使用COMBIN确定给定数量项目可能的总组数。如果觉得概念抽象的话,继续往下阅读你就越来越清楚了。......
  • 复合函数
    #include<stdio.h>intmain(){inta=0;intsum;intb;scanf("%d",&a);if(a<1){printf("%d\n",a);}elseif(1<=a<10){sum=2*a-1;printf("%d\n"......
  • 函数声明
    前言javaSE的运算符、选择语句、循环语句等都能在js使用,就不详细写在笔记里了函数声明functionfunction函数名(形参){}<script>functioncomputed(n,m,op)......
  • Date构造函数
    Date.parse()//Date.parse()方法接收一个表示日期的字符串参数,尝试将这个字符串转换为表示该日期的毫秒数//如果接收的参数并不表示日期,则该方法返回NaNletsomeDate=Da......
  • 游戏主要是这样的,计算正整数 n 每个数位上的数之积,例如 24,它的每个数位上的数字之积为
    publicstaticvoidmain(String[]args){ Scannerinput=newScanner(System.in); System.out.println("请输入一个正整数:"); intnum=input.nextInt(); intc=getN......
  • C语言学习--函数
    函数的作用:(1)提高代码的复用率;(2)提高程序的模块性函数的分类:(1)系统库函数,标准c库:导入头文件--声明函数 ,根据函数原型调用(2)用户自定义函数定义:包含函数原型:返回值......
  • 第19组 chap5 函数与递归 学习总结
    本周我们主要学习了c语言中的自定义函数与递归算法。我们了解到C语言中算法主要是依靠函数而实现的,而自定义函数与函数间的相互调用能帮助我们更好地实现目标。   ......
  • leetcode 15. 3Sum 三数之和(中等)
    一、题目大意给你一个整数数组nums,判断是否存在三元组[nums[i],nums[j],nums[k]]满足i!=j、i!=k且j!=k,同时还满足nums[i]+nums[j]+nums[k]==0。......