使用JS中的高阶函数避免重复?

时间:2016-05-12 08:28:03

标签: javascript functional-programming

如何通过避免在JavaScript中重复创建这样的函数来编写此代码段的更多功能?只是为了给出一个上下文,我试图找到从当前值到最终值的移动是否已经实现。if (deltaValue > 0) { maxPossibleValue = function(current, final) { return current > final ? final : current; } } else { maxPossibleValue = function(current, final) { return current < final ? final : current; } } 如果移动朝向更高值则为正,如果朝向更低值则为负。

<

假设JavaScript中存在>lt作为函数,gtpredicate,我可以使用lt的单个函数对此进行评估是gtmaxPossibleValue = function(predicate) { return function(c, f) { return predicate(c, f) ? c : f } } 处理更高阶函数。但是JS中本身没有这样的函数,上面的方法是唯一的方法吗?

{{1}}

这可以被认为只是模板化所需的谓词函数并返回一个新函数。我在Scheme中看到了这样的模式。

2 个答案:

答案 0 :(得分:2)

@Nina的回答指出了你正确的方向,但Math.max和Math.min不是谓词。答案过于复杂。

我认为没有理由为什么答案应该比这更难以理解

function calculateValue(delta, final, current) {
  return (delta > 0 ? Math.min : Math.max)(final, current);
}

calculateValue(-1, 5, 10); // 10
calculateValue(1, 5, 10);  // 5

答案 1 :(得分:1)

您已经有了满足您要求的机制Math.minMath.max

代码如下所示,但maxPossibleValue具有误导性

var maxPossibleValue = function (predicate) {
        return function (c, f) {
            return predicate(c, f)
        }
    },
    comparer = maxPossibleValue(deltaValue > 0 ? Math.min : Math.max);

工作示例:

var deltaValue = -1;
var maxPossibleValue = function (predicate) {
        return function (c, f) {
            return predicate(c, f)
        }
    },
    comparer = maxPossibleValue(deltaValue > 0 ? Math.min : Math.max);

document.write(comparer(2, 8));