javascript部分函数,​​参数

时间:2014-01-22 19:16:34

标签: javascript

我试图了解部分功能。我找到了这个例子(http://blog.thesoftwarecraft.com/2013/05/partial-functions-in-javascript.html),我完全无法理解。

function partial(f) {
    console.log(f) // tip(p,check)
    var args = Array.prototype.slice.call(arguments, 1); //0.2

    var test_args = Array.prototype.slice.call(arguments);
    console.warn(test_args) // [tip(p,check), 0.2]

    return function () {
        console.warn(arguments) //[120, 0, [120, 90, 180]] [90, 0, [120, 90, 180]] ...
        //where do these arguments come from? why don't appear at test_args?

        var other_args = Array.prototype.slice.call(arguments); //[120, 0, [120, 90, 180]] [90, 0, [120, 90, 180]] ...

        console.log(args.concat(other_args)) // added percentage to array[0.2, 120, 0, [120, 90, 180]]

        return f.apply(null, args.concat(other_args)); //we execute tip with all the arguments (only 2 first will be used)
    }
}

function tip(percentage, check) {
    return check * percentage
}

[120, 90, 180].map(partial(tip, 0.2)); //[24, 18, 36]

2 个答案:

答案 0 :(得分:1)

在编程语言理论中,这被称为部分应用。它基本上需要你的函数需要 n 参数和 nk 参数,并通过部分应用这些提供的 nk返回一个具有 k 参数的函数参数。

以伪代码

为例
function mul(x, y)
    return x*y

function mul2
    return mul(2)

var a = f(1,2); // 3
var b = mul2(4); // 8

虽然该函数有两个参数( n ),但您可以通过仅应用一个参数( n-k )来创建另一个函数。然后新函数只需要一个参数( k )。

您的partial需要一个函数及其arguments。它将这些参数存储在args变量中。然后它返回自身获取其参数的内部函数,但由于它必须将顶层函数中的 nk 参数与内部函数的 k 参数组合在一起,因此您需要{ {1}}并将完整列表传递给原始函数。

编辑:正如安德烈亚斯在评论中指出的那样,这不称为 currying 。其余的答案仍然有效。

答案 1 :(得分:0)

return function () {
     console.warn(arguments) //[120, 0, [120, 90, 180]] [90, 0, [120, 90, 180]] ...
     

这些论点来自哪里?为什么不出现在test_args?

因为它是一个新函数 - 返回的函数 - 它有一个新的arguments对象。你可以在这里查看:

var tipper = partial(tip,0.2);
[120, 90, 180].map(function(el) {
     console.log(arguments); // here they are!
     return tipper(el);
});