函数柯里化实现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()方法通过调用对输入数组中的 ...
随机推荐
- Luogu2938 [USACO09FEB]股票市场Stock Market (DP,多重背包)
第n天不卖,视为卖了又原价买回 #include <iostream> #include <cstdio> #include <cstring> #include ...
- Docke 搭建 apache2 + php8 + MySQL8 环境
Docker 安装 执行 Docker 安装命令 curl -fsSL https://get.docker.com/ | sh 启动 Docker 服务 sudo service docker st ...
- mac怎么清理DNS缓存
可以通过Mac系统启动台功能,在其他页面打开终端进行操作即可. 1.打开终端 2.进入终端界面,输入sudo killall -HUP mDNSResponder命令执行即可.
- MapReduce计算流程
MapReduce的计算流程 1.1 原始数据File The books chronicle the adventures of the adolescent wizard Harry Potter ...
- Filter(过滤器)、ThreadLocal(本地线程)、Listener(监听器)
Filter(过滤器) Filter过滤器它的作用是:拦截请求,过滤响应. 过滤器链 1)执行的顺序依次是: A B C Demo03 C2 B2 A2 2)如果采取的是注解的方式进行配置,那么过滤器 ...
- 7个自定义定时任务并发送消息至邮箱或企业微信案例(crontab和at)
前言 更好熟悉掌握at.crontab定时自定义任务用法. 实验at.crontab定时自定义任务运用场景案例. 作业.笔记需要. 定时计划任务相关命令及配置文件简要说明 at 工具 由包 at 提供 ...
- 区块相隔虽一线,俱在支付同冶熔,Vue3.0+Tornado6前后端分离集成Web3.0之Metamask区块链虚拟三方支付功能
最近几年区块链技术的使用外延持续扩展,去中心化的节点认证机制可以大幅度改进传统的支付结算模式的经营效率,降低交易者的成本并提高收益.但不能否认的是,区块链技术也存在着极大的风险,所谓身怀利器,杀心自起 ...
- 第二十八篇:关于node.js连接数据库
好家伙,这个不难,但是也不简单. $ cnpm install mysql 教程里是带美元符的,但是我打的时候加上美元符用不了,所以我就没用美元符了,一样能行. 还有,淘宝镜像,yyds, var m ...
- CF Workers反向代理并修改请求
用于访问被墙的api请求 async function handleRequest(event) { const request = event.request const host = " ...
- KingbaseES 归档日志清理
WAL是Write Ahead Log的简写,和Oracle的redo日志类似,在R3版本存放在data/sys_log中,R6版本以后在data/sys_wal目录,在数据库访问过程中,任何对数据块 ...