博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
温故而知新:柯里化 与 bind() 的认知
阅读量:6246 次
发布时间:2019-06-22

本文共 1277 字,大约阅读时间需要 4 分钟。

 

什么是柯里化?

科里化是把一个多参数函数转化为一个嵌套的一元函数的过程。(简单的说就是将函数的参数,变为多次入参)

const curry = (fn, ...args) => fn.length <= args.length ? fn(...args) : curry.bind(null, fn, ...args);// 想要看懂上面这个函数,重点在于全面理解bind的用法。// 思路倒是很简单,就是在参数未搜集完善之前,通过bind来实现参数搜集,// 当搜集完成时,就可以执行原函数了。const add = (x, y) => x + y;const curryadd = curry(add);curryadd(4)(4); // 8

 

关于bind的认知

bind 和 call / apply 很相似,都可以改变 this 的指向,也都可以传递参数。但还是有一些区别:

 1)bind不会立即执行函数,而是返回一个新函数。譬如在 React 中我们经常用 bind 将函数的 this 指向组件本身:

export default class ClickOutside extends Component {
constructor(props) {
super(props) this.getContainer = this.getContainer.bind(this) } getContainer(ref) {
this.container = ref }}

 

2)除了 this 以外的参数,会把原函数的参数位给占领(扰乱王?鸠占鹊巢?小三上位?),也就是预设值绑定(赋值):

// demo1: 演示预设绑定 x 和 y 的参数const add = (x, y, z) => x + y + z;add.bind(null, 1, 2)(3) // => 6 , 等价于 add(1, 2, 3)  // demo2:  演示多次bindconst add = (x, y) => x + y;const myadd = add.bind(null, 1).bind(null, 2)myadd() // => 3 , 等价于 add(1, 2) // demo3: 和...args这种数组解构结合使用时可别懵了 O(∩_∩)O哈哈~const add = (...args) => console.log(args, args.length);const myadd = add.bind(null, 1).bind(null, 2).bind(null, 3).bind(null, 4).bind(null, 5)myadd() // =>  [1, 2, 3, 4, 5] 5

这种特性实际上和 偏应用 很相似,区别仅仅在于偏应用不需要关注 this 的绑定。

偏应用的目的只有一个,那就是通过预设值减少函数的参数位,达到简化函数、惰性函数、可重用函数等目的。

转载地址:http://ovria.baihongyu.com/

你可能感兴趣的文章
TF-IDF与余弦相似性的应用(一):自动提取关键词
查看>>
冒泡排序、插入排序、选择排序、快速排序、二分查找(Objective-C实现)
查看>>
nginx反向代理入门
查看>>
Ionic 开发中遇到的常见问题及解决方案
查看>>
mysql数据库存储路径更改 数据文件位置
查看>>
ExtJS5学习之MVVC
查看>>
PDF文档压缩
查看>>
[J2ME]手机流媒体之实作[附源码][与RTSP/MMS协议无关]
查看>>
Scala程序设计读书笔记[1:5]
查看>>
概率论快速学习05:随机变量 二项分布 泊松分布
查看>>
构建Tiny生态圈
查看>>
【vnc】vncserver: couldn't find "xauth" on your PATH 问题
查看>>
扩大Ubuntu的空间
查看>>
Mahout驾驭hadoop之详解
查看>>
java泛型【收藏】
查看>>
Spring Boot自动配置
查看>>
lambda表达式-编译测试
查看>>
Java I/O : Bit Operation 位运算
查看>>
绘制虚线的UIView
查看>>
【Oracle】oracle的LAG和LEAD分析函数
查看>>