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

Currying - How is returned function called with a second argument in JavaScript?

如何在 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() {}().

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

谢谢!

如果表达式的计算结果为函数,则可以使用括号和参数列表调用该函数。

因为表达式liftf(add)returns是一个函数,你调用返回的函数,参数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).

求值

让我们看一个更简单的柯里化示例:

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

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

add(2);

它将扩展为:

function (y) {
    return 2 + y;
}

需要一个 y 参数(如果你调用它的话)。你可以 运行 像这样:

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

或更简洁:

add(2)(5);

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