【问题标题】:Using methods as (curried) functions in JavaScript [closed]在 JavaScript 中将方法用作(咖喱)函数 [关闭]
【发布时间】:2014-09-11 13:31:05
【问题描述】:

将方法转换为柯里化函数的最优雅的方式是什么?Underscore/Lo-dash 或 Ramda 等库中是否支持这种方式?

对于固定数量的参数,我现在正在这样做:

var fn2 = _.curry(function (m, a1, a2, obj) {
  return obj[m].call(obj, a1, a2);
});

允许使用如下代码:

var a2b = fn2('replace', 'a', 'b')
a2b('abc')
=> 'bbc'

还有:

var nl2_ = fn2('replace', '<br>')
nl2_('\n', 'some<br>html')
=> 'some\nhtml'

【问题讨论】:

  • 我不确定问题是什么; lo-dash 显然支持curry,除了按照他们写的方式使用它之外,还有什么可以称为“最优雅”的?
  • curry 只完成了一半的工作,它没有把方法变成函数
  • 这究竟是什么意思,“不把方法变成函数”?
  • 我想将对象表示法obj.func(arg)(其中func是一种“方法”,因为它被定义在对象的上下文上并绑定到对象的上下文)变成func(arg, obj)(一个纯“函数”,它将这个上下文作为参数)
  • 啊,我明白了,对不起。

标签: javascript underscore.js lodash ramda.js


【解决方案1】:

您可以轻松地将您的方法扩展到具有任意数量的方法:

function curryMethod(m, a) {
    if (a !== ~~a) a = m.length;
    return _.curry(function() {
        return m.apply(arguments[a], Array.prototype.slice.call(arguments, 0, -1));
    }, a+1);
}

> var replace = curryMethod(String.prototype.replace)
> replace("a", "b", "abc")
"bbc"
> var a2b = replace("a", "b")
> a2b("abc")
"bbc"

由于您还询问了 Ramda,我只是快速扫描了他们的 API,但发现 R.invoker function 似乎正是您要寻找的。​​p>

【讨论】:

  • 这里有更多关于arguments object的信息
  • 完美,R.invoker 一定是因为与 _.invoke 的相似之处而使我失明了。
猜你喜欢
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 2016-04-10
相关资源
最近更新 更多