JS详解-函数柯里化

简介:

柯里化(Currying)是一种关于函数的高阶技术。柯里化是一种函数的转换,它是指将一个函数从可调用的 f(a, b, c) 转换为可调用的 f(a)(b)(c)。柯里化不会调用函数。它只是对函数进行转换。

举个例子:

已最简单的两项相加可得

<script>// 定义接收一个参数的函数function sum(a){// 内部返回一个接收剩余参数的新函数,返回累加结果return function(b){return a + b;}}</script>

那如果是三项相加的currying呢?“嵌套!”

 // 定义接收一个参数的函数function sum(a){// 内部返回一个接收剩余参数的新函数,返回累加结果return function(b){// 试着在接收一个参数并返回return function(c){return a + b + c;}}}

变式-达到一定目标参数个数就累加:


解决代码:

        // 保存不定长参数let nums = [];function sum(...args) { // 往数组中插入不定长参数nums.push(...args)// 判断参数的个数if(nums.length >= 5) {// 长度大于等于5时,返回累加结果// 注意:就算大于五个参数,也只会返回前五个参数的累加结果// 这里使用了reduce方法,对数组中的每个元素进行累加// slice方法用于截取数组中的前五个元素const res = nums.slice(0, 5).reduce((prev, next) => prev + next, 0);return res;} else {// 2.2 长度没到5 返回函数接收剩余参数return sum;}}

可我们发现如此实现的柯里化函数只能使用一次

这是为什么呢?通过检查数组

是清空数组功能未实现!

nums = []

代码调优-参数自定义:

 function sumMaker(length){// 保存不定长参数let nums = [];function sum(...args) { // 往数组中插入不定长参数nums.push(...args)// 判断参数的个数if(nums.length >= 5) {// 长度大于等于5时,返回累加结果// 注意:就算大于五个参数,也只会返回前五个参数的累加结果// 这里使用了reduce方法,对数组中的每个元素进行累加// slice方法用于截取数组中的前五个元素const res = nums.slice(0, 5).reduce((prev, next) => prev + next, 0);// 清空数组nums = [];return res;} else {// 2.2 长度没到5 返回函数接收剩余参数return sum;}}return sum;}

实际运用:

作者拙见有点像泛型

 const typeOfTest = function(type) {function isUndefined(thing){return typeof thing === type;}return isUndefined;}// 测试代码const isFunction = typeOfTest('function');console.log(isFunction(()=>{})); // trueconsole.log(isFunction({})); // false

根据箭头函数特性精简:

const typeOfTest = type => thing => typeof thing === type;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/591976.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

789. 数的范围 (二分学习)左端大右,右端小左

题目链接https://www.acwing.com/file_system/file/content/whole/index/content/4317/ 当求左端点时&#xff0c;条件是a【mid】大于等于x&#xff0c;并把右端点缩小。 当求右端点时&#xff0c;条件是a【mid】小于等于x&#xff0c;并把左端点扩大。 1.确定一个区间&…

Linux--进程(2)

目录 前言 1. 进程的状态 1.1 进程排队 1.2 运行&#xff0c;阻塞&#xff0c;挂起 2.Linux下具体的进程状态 2.1僵尸和孤儿 3.进程的优先级 4.Linux的调度与切换 前言 这篇继续来学习进程的其它知识 上篇文章&#xff1a;Linux--进程&#xff08;1&#xff09;-CS…

数据库管理工具 DBeaverUE for Mac激活版

DBeaverUE for Mac是一款功能强大且易于使用的数据库管理工具&#xff0c;专为Mac用户设计。它支持多种数据库类型&#xff0c;如MySQL、PostgreSQL、Oracle等&#xff0c;使得用户可以轻松管理和操作各种数据库。 软件下载&#xff1a;DBeaverUE for Mac激活版下载 DBeaverUE …

Prometheus+grafana环境搭建方法及流程两种方式(docker和源码包)(一)

1.选型对比 最近项目上有对项目服务及中间件的监控需求&#xff0c;要做实现方案调研&#xff0c;总结一下自己的成果&#xff0c;目前业界主流可选的方案有&#xff1a; 国外开源&#xff1a; Prometheus&#xff1a;Prometheus - Monitoring system & time series dat…

gpt国内怎么用?最新版本来了

claude 3 opus面世后&#xff0c;这几天已经有许多应用&#xff0c;而其精确以及从不偷懒&#xff08;截止到2024年3月11日还没有偷懒&#xff09;的个性&#xff0c;也使得我们可以用它来首次完成各种需要多轮对话的尝试。 今天我们想要进行的一项尝试就是—— 如何从一个不知…

『VUE』11. 操作数组的方法(详细图文注释)

目录 vue中操作数组的方法会修改原数组的 会进行渲染更新不修改原数组的 不会进行渲染更新 push自动渲染concat 赋值渲染总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 vue中操作数组的方法 vue中数组数据呈现在网页,只检测…

基于卷积神经网络的鸟类识别系统(pytorch框架)【python源码+UI界面+前端界面+功能源码详解】

功能演示&#xff1a; 鸟类识别系统&#xff0c;基于vgg16&#xff0c;resnet50卷积神经网络&#xff08;pytorch框架&#xff09;_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷积神经网络的鸟类识别系统是在pytorch框架下实现的&#xff0c;系统中有两个模型可…

10 年跟踪 Hacker News 招聘贴,解读科技行业变迁

Hackers News (HN) 是国外程序员最喜欢逛的论坛。能登上首页的帖子类似于上了新浪微博。因为其巨大的程序员访问量&#xff0c;因此也成为了公司招聘的渠道。久而久之 HN 招聘帖还形成了专门的标题格式 Ask HN: Who is hiring? 正好有人通过 Ask HN 来分析技术趋势&#xff0c…

js中的事件循环

浏览器进程模型 在理解什么叫事件循环前&#xff0c;我们需要先知道浏览器的进程模型 现代浏览器的功能极度复杂&#xff0c;为了能确保各个部分独立运行互不影响&#xff0c;浏览器会在启动之时开启多个进程&#xff0c;具体而言可以分为以下三种 浏览器进程 负责浏览器的用…

【JavaEE初阶系列】——文件操作 IO 之 文件系统操作

目录 &#x1f4dd;认识文件 &#x1f6a9;树型结构组织 和 目录 &#x1f388;绝对路径和相对路径 &#x1f6a9;文件类型 &#x1f4dd;文件系统操作 &#x1f388;File 概述 &#x1f388;File类的使用 1. 绝对路径 vs 相对路径 2. 路径分隔符 3. 静态成员变量 4…

VSCode SSH 连接 Could not establish connection to “XXX“: spawn UNKNOWN.

1. 确认问题&#xff1a; 拉取vscode终端&#xff1a;快捷键 ctrl(数字1旁边那个) 输入&#xff1a;ssh -V 2. 解决方法 2.1 找到本地SSH 位置 默认本地路径&#xff1a; C:\Windows\System32\OpenSSH 2.2 找到要修改的位置 进入 ssh 插件的设置&#xff08;可以通过在插…

Jenkins首次安装选择推荐插件时出现”No such plugin cloudbees-folder”解决方案

安装Jenkins成功之后&#xff0c;首次启动Jenkins后台管理&#xff0c;进入到安装插件的步骤&#xff0c;选择"推荐安装"&#xff0c;继续下一步的时候出现错误提示&#xff1a; 出现一个错误 安装过程中出现一个错误&#xff1a;No such plugin&#xff1a;cloudb…