函数柯里化实现sum函数
需求
实现sum函数,使其可以传入不定长参数,以及不定次数调用
//示例
console.log(sum(1,2)(3)()) //6
console.log(sum(2,3,4,5)(1,2)(3)(4)()) //23
需求分析
实现sum函数我们可以考虑可以使用闭包的形式来实现
因为每次传参,所以我们不知道这是不是最后一次,如果是最后一个括号,则就要执行
我们可以通过每次调用时对传入参数的个数来判断目前是否是最后一个括号
如果有参数就说明是调用,那么我们就将参数保存到外面的容器中
如果没有参数则说明是调用
如果最后是调用时,我们只需要将所有的参数累加即可
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函数的更多相关文章
- React-高阶函数_函数柯里化
高阶函数_函数柯里化 高阶函数(定义) 如果一个函数符合下面两个规范,就是高阶函数: 如果A函数,接收的参数是一个函数,那么A就是一个高阶函数(比如数组方法arr.map()接收的就是一个处理item ...
- 前端面试手写代码——JS函数柯里化
目录 1 什么是函数柯里化 2 柯里化的作用和特点 2.1 参数复用 2.2 提前返回 2.3 延迟执行 3 封装通用柯里化工具函数 4 总结和补充 1 什么是函数柯里化 在计算机科学中,柯里化(Cu ...
- 【转载】JS中bind方法与函数柯里化
原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...
- [转]js函数式变成之函数柯里化
本文转自:https://segmentfault.com/a/1190000003733107 函数柯里化是指参数逐渐求值的过程. 我觉得它是:降低通用性,提高专用性. 通常,柯里化是这样的过程,“ ...
- 函数柯里化(Currying)示例
”函数柯里化”是指将多变量函数拆解为单变量的多个函数的依次调用, 可以从高元函数动态地生成批量的低元的函数.可以看成一个强大的函数工厂,结合函数式编程,可以叠加出很BT的能力.下面给出了两个示例,说明 ...
- Javascript函数柯里化(curry)
函数柯里化currying,是函数式编程非常重要的一个标志.它的实现需要满足以下条件,首先就是函数可以作为参数进行传递,然后就是函数可以作为返回值return出去.我们依靠这个特性编写很多优雅酷炫的代 ...
- 一道javascript面试题(闭包与函数柯里化)
要求写一个函数add(),分别实现能如下效果: (1)console.log(add(1)(2)(3)(4)()); (2)console.log(add(1,2)(3,4)()); (3)conso ...
- 前端进击的巨人(五):学会函数柯里化(curry)
柯里化(Curring, 以逻辑学家Haskell Curry命名) 写在开头 柯里化理解的基础来源于我们前几篇文章构建的知识,如果还未能掌握闭包,建议回阅前文. 代码例子会用到 apply/call ...
- JS高阶函数与函数柯里化
高阶函数 满足下列条件之一的函数: 函数作为参数被传递(如回调函数): 函数可以作为返回值输出: 一些内置高阶函数的例子: Array.prototype.map map()方法通过调用对输入数组中的 ...
随机推荐
- C#/VB.NET 将PDF转为PDF/X-1a:2001
PDF/X-1a是一种PDF文件规范标准,在制作.使用PDF以及印刷时所需要遵循的技术条件,属于PDF/X-1标准下的一个子标准. PDF/X-1标准有由CGATS于1999年制定的PDF/X-1:1 ...
- Linux系列之链接
前言 在类Unix系统中,一个文件有可能被多个名字引用.我们使用链接来实现这一点,链接共有两种类型:硬链接和软链接,本文分别来介绍它们. 硬链接 硬链接也允许指向文件,但与符号链接的方式不同.它们是U ...
- java-Servlet生命周期与jsp
容器如何处理请求资源路径? 比如,在浏览器地址栏输入:ip地址路径/abc.html. Step1.默认访问的是一个servlet,会从web.xml中查找有没有匹配的servlet. ...
- 分布式版本控制系统Git的使用;
1.什么是Git Git是一个分布式的版本控制软件: 软件,类似于qq.office等安装到电脑才能使用的工具. 版本控制,类似于毕业论文,视频剪辑等需要反复修改和保留原历史数据: 分布式 文件夹拷贝 ...
- axios的content-type是自动设置的
一. axios参数的传递方式 首先我们要知道 参数传递一般有两种,一种是 使用 params, 另一种是 data的方式,有很多的时候我们看到的前端代码是这样的. 1. get请求: ...
- 【MySQL】从入门到掌握2-下载安装
上期:[MySQL]从入门到掌握1-一些背景知识 第一章:下载 官网下载地址: https://dev.mysql.com/downloads/mysql/ https://dev.mysql.com ...
- Linux的NFS的配置
快速代码 # nfs的Server配置文件和配置方法 echo '/newnfs 192.168.3.*rw,sync,no_root_squash)' >> /etc/exports # ...
- 第九十九篇:JS闭包
好家伙,总是要来的,去面对那些晦涩难懂的原理,它就在那里,等着我去搞定它 首先我要去补充一些最基本的概念, 1.什么是内存? 新华字典永远的神, 但这个解释显然不够 去看看百度百科: 内存: CP ...
- 解决报错:axios is not defined
好家伙,来解决报错:axios is not defined 写前端嘛,修bug,不寒颤 进入页面一片空白 来看看报错: 1.axios在安装时:npm install axios --save-de ...
- PostgreSQL 绑定变量窥探
今天我们要探讨的是 custom执行计划和通用执行计划.这一技术在 Oracle中被称为绑定变量窥视.但 Kingbase中并没有这样的定义,更严格地说,Kingbase叫做custom执行计划和通用 ...