雄辩的Javascript:高阶函数

时间:2016-06-28 05:54:57

标签: javascript higher-order-functions

我正在阅读下面的Eloquent Javascript:高阶函数示例,并且已经阅读了问题和答案herehere。但我仍然很困惑。

function noisy(f) {
  return function(arg) {
    console.log("calling with", arg);
    var val = f(arg);
    console.log("called with", arg, "- got", val);
    return val;
  };
}
noisy(Boolean)(0);
// → calling with 0
// → called with 0 - got false
  1. 如果将(0)传递给嘈杂的(f),因为noisy()只接受一个参数,那就是(布尔)?我可以看到内部函数f(arg)基本上是布尔值(0),但我不明白如何将两个参数传递给只允许一个参数的函数。将“嘈杂(布尔)(0)(1)(2)(3);”是一个有效的函数调用?如果是这样,在嘈杂函数中如何区分布尔值后的每个值?哪个值将被“arg”引用?

  2. 书中注意到示例函数正在修改另一个函数。哪个功能正在修改?我不明白作者对“修改”的意思。

2 个答案:

答案 0 :(得分:1)

  

但我不明白两个参数如何传递到a   只允许一个参数的函数

noisy返回一个函数,Boolean传递给noisy0传递给noisy返回的匿名函数,其中fBooleanval变为Boolean(0)

例如

function fn1(arg1) {
  return function fn2(arg2) {
    console.log(arg1, arg2)
  }
}

fn("a")("b") // `a b`, `fn2` is called with `"b"` as parameter

答案 1 :(得分:0)

这是JavaScript中currying的概念,您可以在其中调用函数以返回部分应用的函数或传入其他函数

  

如何将(0)传递到噪声(f),因为noisy()只接受一个参数,那就是(布尔)?

对此的回答是curried函数noisy(),它将函数f作为参数并返回另一个函数。返回的函数在noisy上有一个闭包,因此即使在返回后,它也可以识别Boolean作为参数传递给noisy。这就是为什么调用noisy(Boolean)(0)基本上替代f=Boolean, arg=0

有关 currying http://javascript.crockford.com/www_svendtofte_com/code/curried_javascript/关闭的更多信息,请参阅此处:https://developer.mozilla.org/en/docs/Web/JavaScript/Closures