需求

实现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函数的更多相关文章

  1. React-高阶函数_函数柯里化

    高阶函数_函数柯里化 高阶函数(定义) 如果一个函数符合下面两个规范,就是高阶函数: 如果A函数,接收的参数是一个函数,那么A就是一个高阶函数(比如数组方法arr.map()接收的就是一个处理item ...

  2. 前端面试手写代码——JS函数柯里化

    目录 1 什么是函数柯里化 2 柯里化的作用和特点 2.1 参数复用 2.2 提前返回 2.3 延迟执行 3 封装通用柯里化工具函数 4 总结和补充 1 什么是函数柯里化 在计算机科学中,柯里化(Cu ...

  3. 【转载】JS中bind方法与函数柯里化

    原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...

  4. [转]js函数式变成之函数柯里化

    本文转自:https://segmentfault.com/a/1190000003733107 函数柯里化是指参数逐渐求值的过程. 我觉得它是:降低通用性,提高专用性. 通常,柯里化是这样的过程,“ ...

  5. 函数柯里化(Currying)示例

    ”函数柯里化”是指将多变量函数拆解为单变量的多个函数的依次调用, 可以从高元函数动态地生成批量的低元的函数.可以看成一个强大的函数工厂,结合函数式编程,可以叠加出很BT的能力.下面给出了两个示例,说明 ...

  6. Javascript函数柯里化(curry)

    函数柯里化currying,是函数式编程非常重要的一个标志.它的实现需要满足以下条件,首先就是函数可以作为参数进行传递,然后就是函数可以作为返回值return出去.我们依靠这个特性编写很多优雅酷炫的代 ...

  7. 一道javascript面试题(闭包与函数柯里化)

    要求写一个函数add(),分别实现能如下效果: (1)console.log(add(1)(2)(3)(4)()); (2)console.log(add(1,2)(3,4)()); (3)conso ...

  8. 前端进击的巨人(五):学会函数柯里化(curry)

    柯里化(Curring, 以逻辑学家Haskell Curry命名) 写在开头 柯里化理解的基础来源于我们前几篇文章构建的知识,如果还未能掌握闭包,建议回阅前文. 代码例子会用到 apply/call ...

  9. JS高阶函数与函数柯里化

    高阶函数 满足下列条件之一的函数: 函数作为参数被传递(如回调函数): 函数可以作为返回值输出: 一些内置高阶函数的例子: Array.prototype.map map()方法通过调用对输入数组中的 ...

随机推荐

  1. 从零开始Blazor Server(10)--编辑角色

    例图 目前的样式是这样的: 其中角色在一个table里,然后可以增删改查,并且可以给指定的用户分配权限. 创建文件 首先我们在Pages/Admin目录下新建一个Role.razor.因为我们的Adm ...

  2. 彻底弄懂JS中的this

    首先,用一句话解释this,就是:指向执行当前函数的对象. 当前执行,理解一下,也就是说this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定.this到底指向谁?this的最终指向的 ...

  3. 用 Scanner 扫描CSV文件时报错:“java.util.nosuchelementexception:no line found”的解决方法

    最近用 java 对一个很大的 CSV 文件进行处理.打算用 Scanner 逐行扫描进来,结果报错 "java.util.nosuchelementexception:no line fo ...

  4. java-代码操作服务器之SSH连续发送命令

    java操作Linux服务器可以使用专用的jar包,这里介绍使用jsch操作Linux服务器 maven 依赖 <dependency> <groupId>com.jcraft ...

  5. 第四十六篇:工程化概念以及什么是webpack

    好家伙,这波是概念补充 1.什么是工程化概念? 我的开发: 开个项目,想怎么改怎么改,拉个东西过来就用 实际的前端开发: (1) 模块化(js的模块化,css的模块化,资源的模块化) (2) 组件化( ...

  6. SpringMvc(一)-初识

    1.环境搭建 1.1 jar包 <spring.version>4.3.18.RELEASE</spring.version> <!-- spring-mvc begin ...

  7. HC32L110(四) HC32L110的startup启动文件和ld连接脚本

    目录 HC32L110(一) HC32L110芯片介绍和Win10下的烧录 HC32L110(二) HC32L110在Ubuntu下的烧录 HC32L110(三) HC32L110的GCC工具链和VS ...

  8. Android、iOS平台RTMP/RTSP播放器实时音量调节

    介绍移动端RTMP.RTSP播放器实时音量调节之前,我们之前也写过,为什么windows播放端加这样的接口,windows端播放器在多窗口大屏显示的场景下尤其需要,尽管我们老早就有了实时静音接口,相对 ...

  9. 第一章 kubernetes概述

    一.Kubernetes概述 1.官网地址:https://kubernetes.io 2.GuiHub:https://github.com/kubernetes/kubernetes 3.又来:谷 ...

  10. 游标长时间open导致表无法vacuum问题

    一.问题描述 用户在实际中可能会碰到类似以下 dead rows 无法 vacuum的问题,一个可能的原因是由于游标未结束的原因. test=# vacuum(verbose) t1; INFO: v ...