原型函数在函数组合中的应用
Applying prototype function in function composition
我想了解如何使用_.compose
,例如像这样转动:
url.substr(url.indexOf('?'))
的组合,比如:
var c = _.compose(String.substr, String.indexOf('?'))
c(url)
乌利希期刊指南。很抱歉问了这么愚蠢的问题,但我不明白它应该是怎么工作的。原因:
c = _.compose('abcd'.indexOf)
c('c') // returns 5.. wtf?
No。函数组成
substr(indexOf(url))
= compose(substr, indexOf)(url)
你需要的实际上是一个应用程序,它具有
substr(url, indexOf(url)) // actually substr(url)(indexOf(url))
= ap(substr, indexOf)(url)
幸运的是,它的实现已经存在,让我们使用
function ap(f, g) {
return function() {
return f.apply(this, arguments)(g.apply(this, arguments));
};
}
接下来,我们需要一种方法将String.prototype
的方法转换为函数,就像Firefox中已经存在的那样。我们可以使用bind来实现这个目的,它也有返回(部分)柯里化函数的好处。
var substr = Function.prototype.bind.bind(String.prototype.substr);
var indexOf = Function.prototype.bind.bind(String.prototype.indexOf);
你现在会像使用indexOf("abcd")("c")
或substr("abcd")(2)
一样使用它们。最后但并非最不重要的是,我们需要翻转indexOf
的参数,以便我们可以像使用flippedIndexOf("c")("abcd")
一样使用它(更重要的是,单独获得flippedIndexOf("c")
函数)。所以我们用
function flip(f) {
return function(b) {
return function(a) {
return f(a)(b);
};
};
}
现在,我们可以做你最初想做的了:
var c = ap(substr, flip(indexOf)("?"));
看起来不错,而且实际工作!
但也许这并不值得所有的困惑。直接用
function c(url) { return url.substr(url.indexOf('?')); }
即使没有计算机学位,每个人都能看懂:-)
相关文章:
- 如何将此函数应用于以下JsonML中的每个匹配元素
- 将函数应用于页面上的所有链接
- 将函数应用于填充有数字的对象
- 将jQuery事件函数应用于新的Knockout.js数组元素
- 如何将函数应用于两个数组的第 n 个元素(数组的数组)
- 未定义角度 ng 重复函数应用函数
- 如何将此代码从 2 个函数应用到 1 个函数
- 将 javascript 函数应用于相同的 id
- 有没有一种纯粹的Javascript方法可以将一个函数应用于多个元素的事件
- 如何将Javascript单击函数应用于没有类的元素
- 如何将函数应用于下拉列表
- snap.svg:将函数应用于许多对象
- 无法将 jquery 效果函数应用于动态创建的元素
- 通过函数应用带有挖空的 % 样式绑定不起作用
- 如何将一个函数应用于网页上的多个 Id
- 如何将函数应用于完成 jquery ajax 提交的类
- 如何使onEdit()触发器函数应用于多个工作表
- RequireJS-将构造函数应用于模块
- 如何将javascript函数应用于具有特定域的href
- 将jQuery函数应用于表行,但不应用于第一个表数据