Currying - 如何在JavaScript中使用第二个参数调用返回的函数?

时间:2017-05-30 21:20:20

标签: javascript currying

如何在liftf(add)(1)中调用第二个参数?

function add (first, second) {
    return first + second;
}

function liftf (binary) {
    return function (first) {
        return function (second) {
            return binary(first, second);
        };
    };
}

var inc = liftf(add)(1);

我理解如何调用和存储lift(add)。

我对如何返回函数感到困惑,但后来用(1)调用。

我首先探讨了它是否按照IIFE的相同原则运作但似乎没有。 IFFE将是(function(){}())vs funciton(){}()。

'链式'函数参数让我感到困惑,我想了解发生了什么。

谢谢!

2 个答案:

答案 0 :(得分:0)

如果表达式求值为函数,则可以使用括号和参数列表调用该函数。

由于表达式liftf(add)返回一个函数,因此在括号中使用参数1调用返回的函数:liftf(add)(1)

另一种看待它的方法是,如果将liftf(add)设置为变量,则可以调用存储在该变量中的函数:

var additionFunc = liftf(add) // Stores the new function in additionFunc
var result = additionFunc(1) // Evaluates the new function

让我们看一下IIFEs。假设我们有这样一个:

(function(x) {return x + 1})(5)

(function() { /* ... */ })表达式求值为一个函数,然后由括号和参数(5)进行评估。

答案 1 :(得分:0)

让我们看一个更简单的currying示例:

...
.map(objToArray)
.do(console.log)
.subscribe();

如果你只用一个参数调用它,就像这样:

function add(x) {
    return function (y) {
        return x + y;
    };
}

它将扩展为:

add(2);

期望function (y) { return 2 + y; } 参数(如果你调用它)。你可以这样运行:

y

或者更加简洁:

function (y) {
    return 2 + y;
}(5)

每个函数只是在currying时扩展为一个新的匿名函数,所以即使它看起来很奇怪,一旦你扩展了代码,它就会开始变得有意义。