10.curry 方法
使用方便有用的方法,以减少代码行数,提高我们的工作效率,增加我们的摸鱼时间。
curry 方法
功能:柯里化一个函数。
const curry = (fn, arity = fn.length, ...args) =>arity <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args);
说明一下:
- 使用递归
- 如果提供的参数(
args
)的数量足够,则调用传递的函数fn
。 - 否则,使用
function.prototype.bind()
返回一个 curry 过的函数fn
,该函数期望得到其余的参数。 - 如果我们想要 curry 一个接受可变参数数量的函数(一个可变参数函数,例如
Math.min()
),我们可以选择将参数数量传递给第二个形参。
有点抽象,直接 看下示例:
curry(Math.pow)(2)(10); // 1024
curry(Math.min, 3)(10)(50)(2); // 2
看完示例可能更懵了,这是什么鬼?
首先,我们先看 curry(Math.pow)(2)(10)
,
执行 curry(Math.pow)
,代入进去得:
const curry = (Math, arity = (Math.pow).length, null)
(Math.pow).length
表示函数参数的个数,
因为 Math.pow
需要传入两个参数,所以 (Math.pow).length
的值为2
。代入进去得:
const curry = (Math, arity = 2, null) => 2 <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args);
因为我们没有传参数,所以 args.length
为 0
, 2 <= 0
不成立,返回 curry.bind(null, fn, arity, ...args)
,所以
curry(Math.pow)(2)(10)
第一次 curry 后的结果,可以看成
curry(Math.pow, 2)(10)
此时 args.length
为 1
, 2 <= 1
不成立,所以还是返回 curry.bind(null, fn, arity, ...args)
,即
curry(Math.pow, 2)(10)
结果是
curry(Math.pow, 2, 10)
此时 args.length
为 2
, 2 <= 2
成立,所以返回 fn(...args)
,即
Math.pow(2, 10)
即 1024
彩蛋
大家可能对 bind 比较陌生,这里简单介绍一下:
bind()
方法会创建一个新函数,当这个新函数被调用时,它的 this
值是传递给 bind()
的第一个参数, 它的参数是 bind()
的其他参数和其原本的参数。
语法是这样样子的:
fun.bind(thisArg[, arg1[, arg2[, ...]]])
thisArg
当绑定函数被调用时,该参数会作为原函数运行时的this
指向。当使用new
操作符调用绑定函数时,该参数无效。- arg1, arg2, … (可选)当绑定函数被调用时,这些参数加上绑定函数本身的参数会按照顺序作为原函数运行时的参数。
参数
bind
的第一个参数会作为原函数运行时的 this 指向,不多说;而第二个开始的参数是可选的,当绑定函数被调用时,这些参数加上绑定函数本身的参数会按照顺序作为原函数运行时的参数。怎么理解?
function fn(a, b, c) {return a + b + c;
}var _fn = fn.bind(null, 10);
var ans = _fn(20, 30); // 60
fn 函数需要三个参数,_fn 函数将 10 作为默认的第一个参数,所以只需要传入两个参数即可,如果你不小心传入了三个参数,放心,也只会取前两个。
function fn(a, b, c) {return a + b + c;
}var _fn = fn.bind(null, 10);
var ans = _fn(20, 30, 40); // 60
10.curry 方法相关推荐
- 基础必备 | Python处理文件系统的10种方法
作者 | Jeff Hale 译者 | 风车云马:责编 | Jane,Rachel 出品 | Python大本营(ID:pythonnews) [导读]在编写一些Python程序的时候,我们常常需要与 ...
- 人工智能改进传统云ERP的10种方法
http://blog.itpub.net/31542119/viewspace-2168809/ 随着数字化转型的进程加快,企业开始重新评估ERP的作用.传统ERP经过多年僵硬化定制过于追求生产的一 ...
- 【转载】快速升职加薪的10个方法
原文地址:http://www.jobbole.com/content.php/901 想要受到大家关注,得到老板的提拔和重用,仅仅埋头苦干是不够的.教你10个方法,让你成为办公室红人,成为老板面前的 ...
- 改善WPF应用程序性能的10大方法(转)
细数改善WPF应用程序性能的10大方法 2010年11月16日00:05 it168网站原创 作者:IT168 黄永兵 编辑:胡铭娅 评论:0条 本文Tag: ASP.NET WPF .NET ...
- python与excel做数据可视化-用Python进行数据可视化的10种方法
原标题:用Python进行数据可视化的10种方法 2015-11-19 关于转载授权 大数据文摘作品,欢迎个人转发朋友圈,自媒体.媒体.机构转载务必申请授权,后台留言"机构名称+转载&quo ...
- 几周内搞定Java的10个方法
几周内搞定Java的10个方法 不要将Java与JavaScript弄混了,Java的目标是"一次编译,到处调试"(呃,不对,是"到处运行").简单来说, ...
- 提高C程序效率的10种方法
任何代码的美丽不仅在于找到一个给定的问题的解决方案,但在它的简单性,有效性,紧凑性和效率(内存).设计的代码比实际执行更难 .因此,每一个程序员当用C语言开发时,都应该保持这些基本的东西在头脑中. 本 ...
- C 程序更有效率的 10 种方法
转至:http://blog.chinaunix.net/space.php?uid=26495963&do=blog&id=3062636 任何代码的美丽不仅在于找到一个给定的问题的 ...
- 10 大方法,让您的客服中心提供更出色的服务
在过去的 5 年中,客户服务中心所经历的变化,超过了以往 35 年的总和.由于客户期望提高.接触渠道增多和社交媒体的流行,客户服务所面临的挑战较以往任何时候都更为复杂.客户的服务体验仍旧是其认知品牌的 ...
- 让你的C程序更有效率的10种方法
PS:原文翻译的有些地方不太确切,尤其是对于第7点static的使用的翻译容易引起误解,故稍做调整,如有妥之处,还请谅解! 任何代码的美丽不仅在于找到一个给定的问题的解决方案,还在它的简单性,有效性, ...
最新文章
- 网络推广是什么浅析网站内的链接优化技巧有哪些?
- 物联网的下一步动作会是什么?
- 傅里叶变换 直观_A / B测试的直观模拟
- Leetcode--162. 寻找峰值
- 哈佛大学单细胞课程|笔记汇总 (八)
- pandas 作图 统计_pandas数据作图方法
- 常用的密码破解方法大汇总
- 【Codeforces 1051D】Bicolorings
- 计算机考研数据结构答案,计算机考研数据结构试卷八(练习题含答案)
- 近期14个“AI产品经理”职位JD推荐(覆盖北京、上海、深圳、成都、重庆、杭州)
- ps入门第4天_ps画笔工具知识汇总_自定义画笔工具_画笔画彩带
- 内网禁用u盘 远程协助_如何在Windows 10中禁用远程协助
- 微信号名称乱码什么情况_“微信号”与“微信账号”有什么区别?
- Cravatar:WordPress网站Gravatar头像完美替代方法
- “剑指Offer”数据结构篇:java实现
- uniapp爱玩小灰视频播放器使用流程
- 爬虫 | 百行代码爬取14.5W条豆瓣图书信息
- Virtualbox源码分析20 NEM(Hyper-V兼容)1 Hyper-V架构和API介绍
- BACnet协议详解——序
- Tm4c123GX(tiva)入门详细教程