javascript部分函数,参数

lsmepo6l  于 2023-01-04  发布在  Java
关注(0)|答案(2)|浏览(166)

我正在尝试理解部分函数。我发现了这个例子(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]
2cmtqfgy

2cmtqfgy1#

在编程语言理论中,这被称为partial application,它基本上接受需要 n 个参数和 n-k 个参数的函数,并通过部分应用这些提供的 n-k 个参数来返回一个具有 k 个参数的函数。
以伪代码为例

function mul(x, y)
    return x*y

function mul2(y)
    return mul(2, y)

var a = mul(2, 3); // 6
var b = mul2(4); // 8

虽然这个函数有两个参数(n),但你可以只使用一个参数(n-k)来构造另一个函数,这样新函数就只需要一个参数(k)了。
partial接受一个函数和它的arguments,它将这些参数存储在args变量中,然后返回内部函数,内部函数本身接受它的参数,但由于它必须将来自顶级函数的 n-k 个参数与内部函数的 k 个参数组合在一起,因此得到concat,并将完整列表传递给原始函数。
编辑:正如Andreas在评论中指出的那样,这不叫"咖喱",但剩下的答案仍然成立。

kfgdxczn

kfgdxczn2#

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);
});

相关问题