Effective JavaScript Item 26 使用bind来进行函数的柯里化(Curry)
来源:互联网 发布:现代战争5数据总是重制 编辑:程序博客网 时间:2024/06/05 18:13
本系列作为Effective JavaScript的读书笔记。
在上一个Item中介绍了bind的一种用法:用来绑定this对象。但是实际上,bind含有另一种用法,就是帮助函数进行柯里化。关于柯里化,这里有一份百科可以参考:
http://zh.wikipedia.org/wiki/%E6%9F%AF%E9%87%8C%E5%8C%96
但是实际上,关于柯里化只需要记住一点就够了:柯里化是把接受多个参数的函数变换成接受一个单一参数(通常是最初函数的第一个参数,但是并无限制)的函数,并且返回这个接受单一参数函数的过程。
一个用来连接字符串得到URL的例子:
function simpleURL(protocol, domain, path) {return protocol + "://" + domain + "/" + path;}
那么当有一系列的path需要被映射得到对应的URL的时候,可以借助ES5的map方法:
var urls = paths.map(function(path) {return simpleURL("http", siteDomain, path);});
上面的方法实现起来不难,但是有提高的空间。注意到在调用simpleURL的时候,传入的前两个参数都是固定的,只有第三个参数path在每次调用时不一样。这时候bind就可以派上用场了:
var urls = paths.map(simpleURL.bind(null, "http", siteDomain));
因为simpleURL函数最终会直接被调用,其实现中并没有依赖this的指向,所以在使用bind的时候,第一个参数传入的是null。紧接着传入了simpleURL函数的前两个参数,对它进行柯里化,得到了只接受path作为参数的一个新的函数,并传入到map方法中作为回调函数。
那么从上面的例子中,也可以看出在什么场景下适合对函数进行柯里化。当需要多次调用的函数接受的参数过多且大多数都是固定的情况下,可以考虑使用bind对它进行柯里化。
总结:
- 当场景合适的情况下,考虑使用bind实现函数/方法的柯里化
- 当function以函数的形式调用时(即不考虑this的指向),可以使用null或者undefined作为bind的第一个参数
1 0
- Effective JavaScript Item 26 使用bind来进行函数的柯里化(Curry)
- Effective JavaScript Item 13 使用即时调用的函数表达式(IIFE)来创建局部域
- Effective JavaScript Item 22 使用arguments来创建接受可变参数列表的函数
- Effective JavaScript Item 25 使用bind方法来得到一个固定了this指向的方法
- Javascript实现函数的curry化
- Effective JavaScript Item 24 使用一个变量来保存arguments的引用
- Effective JavaScript Item 46 优先使用数组而不是Object类型来表示有顺序的集合
- javascript的bind()函数使用
- 用 curry 过的闭包进行函数式编程
- Effective JavaScript Item 28 不要依赖函数的toString方法
- 《Effective C#》Item 11:提倡使用foreach语句来进行循环操作
- 《Effective C#》Item 11:提倡使用foreach语句来进行循环操作
- 转:《Effective C#》Item 11:提倡使用foreach语句来进行循环操作
- 《Effective C#》Item 11:提倡使用foreach语句来进行循环操作
- 《Effective C#》Item 11:提倡使用foreach语句来进行循环操作
- 《Effective C#》Item 11:提倡使用foreach语句来进行循环操作
- Effective JavaScript Item 20 使用call方法来绑定this变量
- Effective JavaScript Item 27 使用闭包而不是字符串来封装代码
- nginx文件类型错误解析漏洞
- 数独 Sudoku poj 2676
- iOS 开发 第一次
- java查看当前method的上级类和方法
- Apache 2.2 虚拟主机配置
- Effective JavaScript Item 26 使用bind来进行函数的柯里化(Curry)
- 数据结构之堆栈7概括
- Android城市三级联动选择器
- svn : Can not Parse lock / entries hashfile错误解决办法
- Pro Android学习笔记(一二九):Media Frameworks(4):JetPlayer、AsyncPlayer和AudioTrack
- Android WebView 开发详解(二)
- android引用类库工程的2种方法
- Struts中DispatchAction和Action类有什么不同?
- C++定义动态数组