javascript - Javascript 中的高阶函数

标签 javascript function higher-order-functions

我正在阅读 Eloquent JavaScript ( The new edition ),并且读到了有关高阶函数的部分,但我对以下代码中发生的情况感到困惑。

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. 为什么函数的调用如此嘈杂? (Boolean) 是强制转换吗?选 Actor 是为了什么?返回值?或论证?如果它是返回值,为什么不 (Boolean)noisy(0) 呢?或者,如果参数是正在转换的参数,则为“noisy((Boolean) 0)”。

    noisy(Boolean)(0)
    
  2. 这一行发生了什么? f() 是在哪里定义的?

    var val = f(arg);
    

最佳答案

  1. Boolean 是一个函数。这是您通过 noisy 间接调用的函数。我知道有点令人困惑,因为它看起来像一个类型的名称。但在 JavaScript 中,那些初始上限的东西(BooleanNumberString 等)是函数 。当您调用 Boolean(使用 new)时,它会尝试将您提供的参数转换为 boolean原始值并返回结果。 (请参阅规范中的 §15.6.1。)

  2. fnoisy 函数中参数的名称。

JavaScript 中的函数是一流的对象。您可以将它们作为参数传递到其他函数中,就像任何其他对象一样。

当你这样做时

noisy(Boolean)(0)

有两件事正在发生。第一:

// (In effect, we're not really creating a variable...)
var x = noisy(Boolean);

这为我们提供了一个函数,在调用时,它将使用我们给它的参数调用 Boolean,同时执行这些 console.log 语句。这是您在 noisy 中看到的创建函数 (return function(arg)...);

然后我们调用该函数:

x(0);

这时您就会看到控制台输出。由于 Boolean(0)false,因此您会看到 Boolean 返回该值。

这是一个更简单的示例:

function foo(bar) {
    bar();
}
function testing() {
    alert("testing got called");
}
foo(testing);

在那里,我将函数 testing 传递给 foo。我在 foo 中使用的参数名称是 barbar(); 行调用该函数。

关于javascript - Javascript 中的高阶函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23535316/

相关文章:

javascript - 将参数作为对象文字发送的更好方法?

javascript - 将 Angularjs Protractor promise 从字符串转换为 float ?

Javascript/JQuery 故障排除

javascript - 将 Blueimp Gallery 与 HTML 和 Bootstrap 集成时遇到问题

r - 如何将对象从 R 函数外部传递到函数体?

c - 传递指针数组并接收错误消息

javascript - ReactJS,渲染后重定向

java - 了解 Java 8 Lambda 表达式

recursion - 由于 zipper 和 HOF,递归是一种气味(在惯用的 Clojure 中)吗?

javascript - Cheerio,如何将其提取为json?