使用布尔值作为参数的高阶函数

Higher order function using Boolean as argument

我一直在读一本关于 JavaScript 的书,即 Eloquent JavaScript,我遇到了以下函数。我不明白它到底是如何工作的?

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

什么样的参数是布尔值,什么是一个接一个地传递两个参数JavaScript。如果有人能解释这是如何工作的,我将不胜感激?提前致谢。

Boolean 是一个 javascript 原始类型构造函数

noisy(Boolean) 会 return 以下函数

function(arg) {
    console.log("calling with", arg);
    var val = Boolean(arg); // <- see the Boolean here
    console.log("called with", arg, "- got", val);
    return val;
}

所以 noisy(Boolean)(0); 会执行上面的函数,传递 0 作为参数 9arg)

解决我认为你的问题是:

  • Boolean 是一个函数——它是布尔基元对象包装器类型的标准构造函数;
  • noisy()是一个函数,它以一个函数作为参数,returns另一个函数;
  • ...因此调用 noisy(Boolean) 会产生一个函数,因此可以使用另一个带括号的参数列表调用该函数。

所以

noisy(Boolean)(0)

调用noisy()函数,然后调用返回的函数。返回的函数记录消息(我想这就是它被称为 "noisy" 的原因)并显示最初传递的函数 (Boolean) 的作用。

布尔值是内置的 function/constructor,参见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean

f(x)(y) 表示:调用 f,将 x 作为参数传递。然后获取返回值(必须是另一个函数),并调用它,将 y 作为参数传递。它的工作方式类似于 var tmp = f(x); tmp(y);.

noisy(Boolean) returns

function(arg) {
    console.log("calling with", arg);
    var val = f(arg);
    console.log("called with", arg, "- got", val);
    return val;
};

其中 f 绑定到 Boolean

然后用 0 调用该函数执行

console.log("calling with", arg);
var val = f(arg);
console.log("called with", arg, "- got", val);
return val;

其中 f = Booleanarg = 0,即

console.log("calling with", 0);
var val = Boolean(0);
console.log("called with", 0, "- got", val);
return val;