在JavaScript中将方法用作(curried)函数

Using methods as (curried) functions in JavaScript

本文关键字:curried 函数 JavaScript 方法      更新时间:2023-09-26

将方法转换为curried函数的最优雅方法是什么?在像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'

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

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函数,这似乎正是你想要的。