news 2026/6/15 20:55:46

短视频开源源码,js函数柯里化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
短视频开源源码,js函数柯里化

短视频开源源码,js函数柯里化

函数柯里化

维基百科: 柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。(这里说的是 返回一个接受单一参数的函数,我觉得我们实现的时候,可以更灵活,返回一个可以接受任意多参数的函数)

柯里化有什么用途

curry 的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

// 原函数varadd=function(x,y){returnx+y;};// 简单curry化后 应该是:varadd=function(x){returnfunction(y){returnx+y;};};// 实现分开传参的目的// 先加10varaddTen=add(10);// 再加5addTen(5);// 15addTen(10);// 20

好处: 可以固定相同参数,实现函数调用传参的简单化。

举个例子,计算一个长方体的体积,如果长方体长和宽是不变,高度是发生变化的。
一般情况下我们会这么做:

functionvolumn(l,w,h){returnl*w*h}// 计算过程会变成这样letV1=volumn(10,20,30)letV2=volumn(10,20,20)letV3=volumn(10,20,15)如果我们把volumn函数柯里化,变成如下函数:functioncurry_volumn(l,w){returnfunction(h){returnl*w*h}}// 计算过程可以优化如下// 先传入长和宽,得到一个新函数letsquare=curry_volumn(x,y)// 再计算体积letV1=square(30)letV2=square(20)letV3=square(15)

例子简单,大家自己体会其中的好处。下面我们就是要实现一个curry工具。

curry工具函数的简单实现

​ 需要注意传入工具函数的函数参数是不一定的。

// 思路:// 1. curry工具函数 接受一个函数返回一个函数,框架如下:// function curry(fn) {// return function(...args) {}// }// 2. 返回的函数可以接受一个参数或者多个参数,// a.如果args长度大于等于 fn.length(形参),直接返回fn函数的执行结果// b.如果args长度小于 fn.length(形参),继续返回一个函数,返回的函数需要继续执行第二步的递归调用,别且记录前几次输入的参数,知道参数长度大于等于fn.length,返回fn执行结果// function curry(fn) {// return function(...args) {// if(args.length >= fn.length) {// 如果传入参数长度等于原函数形参长度,直接返回结果// } else {// 返回一个函数,函数内部需要重新比较args.length >= fn.length,于是我封装了递归函数 rec// }// }// }// 柯里化工具函数functioncurry(fn){// 获取形参的长度returnfunction(...args){if(args.length>=fn.length){// 如果传入参数长度等于原函数形参长度,直接返回结果returnfn.apply(this,args)}else{// 否则返回一个函数letlength=args.length;returnrec;functionrec(...others){if(others.length+length>=fn.length){returnfn.apply(this,args.concat(others))}else{args=args.concat(others)length=others.length+lengthreturnrec}}}}}// 用上面的例子做测试functionvolumn(l,w,h){returnl*w*h}letcurry_volumn=curry(volumn)letsquare=curry_volumn(10,20)console.log(square(10))// 2000console.log(square(20))// 4000console.log(square(30))// 6000// 测试传入不同数量的参数console.log(curry_volumn(10)(20)(30))// 6000console.log(curry_volumn(10)(20,30))// 6000console.log(curry_volumn(10,20)(30))// 6000console.log(curry_volumn(10)(20)(3

短视频开源源码,js函数柯里化

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 16:00:50

《P1850 [NOIP 2016 提高组] 换教室》

题目背景NOIP2016 提高组 D1T3题目描述对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程。在可以选择的课程中,有 2n 节课程安排在 n 个时间段上。在第 i(1≤i≤n)个时间段上,两节内容相同…

作者头像 李华
网站建设 2026/6/15 18:52:24

芯片制造企业如何利用百度富文本编辑器实现PDF跨平台编辑?

今天早上刚到工位,就收到一位网友的微信私聊——原来是某初中学校外包项目的对接人,想咨询Word文档一键导入功能的实现方案。其实我的微信号早在技术社区公开过,但仍有不少开发者表示"大海捞针",这找技术资源的难度堪比…

作者头像 李华
网站建设 2026/6/15 19:25:21

基于8086的步进电机系统数码管显示转速数值含报告(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于8086的步进电机系统数码管显示转速数值含报告(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码 proteus仿真汇编源码基于8086步进电机,8086电机系统转数档位数值正转前面显示0,反转显示-,…

作者头像 李华
网站建设 2026/6/15 19:34:12

裁员这事儿,还真没完了。。

2026年的大环境并不乐观,身边不少朋友失业,收入都在下滑。不少读者问我如何应对,思来想去还是要做增量,守是守不住的。不管是打工还是自己做事情,一定要做增量。比如搞副业、开辟新业务等等。另外就是,不要…

作者头像 李华
网站建设 2026/6/15 19:34:32

面试官:什么是 Redis 的数据分片?

在线 Java 面试刷题(持续更新):https://www.quanxiaoha.com/java-interview 面试考察点 面试官提出这个问题,通常不仅仅是想知道一个简单的定义。其核心考察点在于: 对分布式系统核心思想的理解:考察你是否…

作者头像 李华
网站建设 2026/6/15 13:25:56

COSCon‘25 第十届中国开源年会登上中国日报,并获评思否「最受开发者欢迎的技术活动」

由开源社主办的 COSCon25 第十届中国开源年会于 2025 年 12 月在北京圆满落幕。开源驱动的下一代 AI 技术与生态、AI 时代的数据挑战、开源芯片的生态发展与未来趋势、新时代下的全球协作、被 AI 颠覆的 Coding、极速狂飙的具身智能开源浪潮…… 这些在开年 DeepSeek 时刻之后&…

作者头像 李华