JavaScript - 此高阶函数的含义

时间:2017-03-15 19:44:58

标签: javascript function higher-order-functions

首先抱歉,如果我没有在正确的地方发帖或者已经有重复,但我不知道该怎么称呼它或如何搜索它。

有人可以向我解释以下代码的含义:

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

为什么在函数调用后需要(布尔)?

noisy(Boolean)(0);

我称这种函数调用是什么?

提前致谢!

4 个答案:

答案 0 :(得分:5)

这很棘手。 (Boolean)可能会让你离开这里,但实际上它只是一个常规的旧参数。您可以将Boolean替换为任何功能,例如doStuff,并且它仍然有效。

是的,正如你所指出的,这是一个重复的问题。你正在寻找一种叫做"封闭的东西。"这是StackOverflow的绝佳答案:

How do JavaScript closures work?

答案 1 :(得分:2)

“noisy”是一个函数,如果你调用它就会返回一个函数。

通过将Boolean传递给函数,Boolean被调用为Boolean(0),结果为false,因为0是假值。

Boolean只是一个构造函数,可用于创建布尔值或将任何值转换为布尔值。

答案 2 :(得分:2)

您正在调用函数noisy(...),该函数返回另一个函数,该函数使用其参数中的信息构造。 函数调用 noisy(Boolean)(0);实际上是两个函数调用,可以(可能应该)写成:

var noisyFunction = noisy(Boolean)
noisyFunction(0)

noisy()接受函数的事实(Boolean是函数MDN)。对这里使用的语法没有实际影响,它可能不需要参数,或者更少的东西。

您选择的高阶函数标签实际上总结了它。这是用它们编程的一个例子。在f返回后,noisyFunction可以使用值noisy的事实是闭包(MDN)的结果。然后,一些程序员可能会将此描述为"使用闭包",但它并不特定于所显示的模式。

答案 3 :(得分:1)

您需要传递f - 它可以是Boolean函数以外的任何内容。尝试

const increment = x => x+1;
const noisyInc = noisy(increment);
console.log(noisyInc(1));

在原始代码中,省略了中间变量 - 就像我在这里写noisy(increment)(1)一样。