JavaScript - 这个高阶函数的含义

JavaScript - Meaning of this Higher Order Function

首先,如果我没有在正确的位置发帖或者已经有重复的帖子,我深表歉意,但我不知道如何称呼它或如何搜索它。

谁能给我解释一下下面的代码是什么意思:

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

为什么函数调用后需要有 (Boolean)?

noisy(Boolean)(0);

这种类型的函数调用叫什么?

提前致谢!

"noisy" 是一个函数,如果你调用它,returns 就是一个函数。

通过将 Boolean 传递给函数,Boolean 的调用方式与 Boolean(0) 类似,结果是 false,因为 0 是一个虚假值。

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

您需要传递一个 f - 它可以是 Boolean 函数以外的任何东西。尝试

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

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

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

var noisyFunction = noisy(Boolean)
noisyFunction(0)

事实上 noisy() 接受一个函数(Boolean 是一个函数 MDN)。对此处使用的语法没有实际影响,它可以不带任何参数,或者不那么滑稽的东西。

您对高阶函数标签的选择确实是一种总结。这是使用它们编程的示例。 fnoisy returns 之后对 noisyFunction 可用的事实是闭包 (MDN) 的结果。一些程序员可能会将此描述为 "using a closure",但它并不特定于所示模式。

这是棘手的事情。 (Boolean) 在这里可能会让您失望,但实际上它只是一个常规的旧参数。您可以将 Boolean 替换为任何函数,例如 doStuff,它仍然有效。

是的,正如您所指出的,这是一个重复的问题。您正在查看名为 "closure." 的内容,这是来自 Whosebug 的绝妙答案:

How do JavaScript closures work?