理解Eloquent JavaScript中函数式编程中的apply方法示例

时间:2013-05-20 19:21:29

标签: javascript function functional-programming

我正在阅读Eloquent JavaScript,我得到了Functional programming (chapter 6)。我对以下示例感到困惑:

show(Math.min.apply(null, [5, 6]));

function negate(func) {
  return function() {
    return !func.apply(null, arguments);
  };
}

*注意:show()只是将输出打印到Eloquent JavaScript网站上的控制台。

我不知道negate()函数如何与show()中的代码相关。调用negate()函数在哪里?我没有看到它在那个例子中的任何地方使用过,或者我错了吗?

2 个答案:

答案 0 :(得分:4)

给出的代码包含两个示例。每个函数都有apply方法。在第一个示例中,Math.min的{​​{1}}方法用于使用参数列表apply调用Math.min。第二个示例应与前面的示例(其中[5,6]定义为

)形成对比
negate

在该示例中,function negate(func) { return function(x) { return !func(x); }; } 返回一个参数的新函数,该函数使用该单个参数调用negate(func),否定结果并返回它。但是,如果func期望多个参数,会发生什么?这就是这个例子所涵盖的内容。

func

在此定义中,function negate(func) { return function() { return !func.apply(null, arguments); }; } 返回一个新函数,其中包含任意数量的参数,它使用提供的参数列表调用negate(func),否定结果并返回

答案 1 :(得分:1)

本书的这一部分是为了解释某些函数采用多个参数,因此您必须使用func而不仅仅.apply()调用func(x)参数。

第一个示例使用NaN,它接受​​一个参数。这就是它使用的原因:

return !func(x);

但是某些函数(如Math.min)接受了几个参数。从技术上讲,使用negate时,您不知道将传递什么函数,以及将传递哪些参数。因此,您无法在传递给x的{​​{1}}中进行硬编码。使用func,您可以将原始参数.apply()传递给arguments来电。

参考: