Javascript中的高阶函数

Javascript中的高阶函数,javascript,function,higher-order-functions,Javascript,Function,Higher Order Functions,我正在阅读雄辩的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)

我正在阅读雄辩的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
  • 为什么对函数的调用会像这样吵闹?(布尔)是一个类型转换吗?什么演员?返回值是多少?还是争论?如果它是返回值,为什么不使用(布尔)noise(0)。或嘈杂((布尔)0),如果参数是要强制转换的参数

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

    var val = f(arg);
    
  • Boolean
    是一个函数。这是您通过
    noise
    间接调用的函数。我知道有点混乱,因为它看起来像一个类型的名称。但是在JavaScript中,那些最初被限制的东西(
    布尔值
    数字
    字符串
    ,等等)是函数。当您使用
    new
    调用
    Boolean
    而不使用
    new
    )时,它会尝试将您提供的参数转换为
    Boolean
    原语值并返回结果。(参见规范中的。)

  • f
    noised
    函数中参数的名称

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

    当你这样做的时候

    noisy(Boolean)(0)
    
    有两件事正在发生。第一:

    // (In effect, we're not really creating a variable...)
    var x = noisy(Boolean);
    
    这给了我们一个函数,当被调用时,它将使用我们给出的参数调用
    Boolean
    ,同时执行那些
    console.log
    语句。这是您在
    noised
    返回函数(arg)…
    )中看到的正在创建的函数

    然后我们称之为函数:

    x(0);
    
    这时您将看到控制台输出。由于
    Boolean(0)
    false
    ,因此可以看到
    Boolean
    返回该值

    下面是一个简单得多的例子:

    function foo(bar) {
        bar();
    }
    function testing() {
        alert("testing got called");
    }
    foo(testing);
    
    在这里,我将函数
    testing
    传递到
    foo
    。我在
    foo
    中使用的参数名是
    bar
    。行
    bar()
    调用函数。

    没有()的函数是实际函数。带有()的函数是对该函数的调用。还请记住,JavaScript是一种松散类型的语言,因此不声明变量类型。我在您的示例中添加了一些注释,以尝试提供帮助

    // We define a function named noisy that takes in an argument named f. We are expecting f to be a function but this isn't enforced till the interpreter throws an error. 
    function noisy(f) {
    // Noisy returns a single item, an anonymous function. That anonymous function takes in an argument named arg
      return function(arg) {
        console.log("calling with", arg);
    // Our anonymous function then takes f (It can use f because its defined inside noisy, see closures for more details) and invokes it with the argument arg and stores the result in a variable named val. 
        var val = f(arg);
        console.log("called with", arg, "- got", val);
    // It now returns val
        return val;
      };
    }
    
    那么Noised(Boolean)(0)就是这样工作的

    function(arg) {
      var val = Boolean(arg);
      return val;
    }
    
    f是布尔函数

    Noised返回如下函数

    function(arg) {
      var val = Boolean(arg);
      return val;
    }
    
    现在我们有了

    我们返回的函数(0)

    它执行起来就像正常的一样

    function(0) {
      var val = Boolean(0); // false
      return val;
    }
    

    我对JS相对来说是新手,我也刚刚阅读了有说服力的Javascript,我发现一旦我理解了函数的调用(回答您的第1点),就更容易理解了:

    noised(Boolean)
    创建一个新函数,
    (0)
    在它后面,因为它是作为参数传递到该新函数中的。如果您返回到大于的示例:

    function greaterThan(n) {
      return function(m) { return m > n; };
    }
    var greaterThan10 = greaterThan(10);
    console.log(greaterThan10(11));
    
    也可以这样称呼它:

    greaterThan(10)(11);
    
    我希望这能澄清你的第一个问题,即为什么这样称呼它

    关于第二个问题。
    f
    在:

    var val = f(arg);
    
    是输入
    noised(Boolean)
    时传递到
    noised
    Boolean
    函数。然后,它被用作嘈杂函数中的参数。我也没有意识到布尔值本身可能是一个函数,而不仅仅是一种数据类型。正如其他人所说,它将您提供的参数转换为布尔值并返回结果

    因此,
    val
    变成
    Boolean(arg)
    变成
    Boolean(0)
    ,计算结果为
    false
    。如果您尝试调用
    noised(Boolean)(1)
    您将看到它返回
    true
    console.log(“调用时使用”,arg,“-get”,val)
    只记录参数(本例中为0)和计算结果(false)

    实际上,它已将布尔函数更改为记录参数和结果以及返回结果的函数


    我希望这有帮助。写下它有助于我自己的理解。

    如果你在这方面仍然有问题,以下是我的理解方式(它也让我头疼……)

    函数只是一个常规值。上一句话是理解这里发生的事情的关键

    我们的噪声(f)函数是一个值。这是它的回报

    Noised(f)返回带参数(arg)的函数。

    Noised(f)也接受参数(f)。内部函数(从函数内部调用的函数)可以访问传递给外部函数的变量和参数

    我们调用外部函数并将参数传递给它。我们的外部函数返回其内部函数,该函数接受一个参数(0)。 通过理解上面的内容,我们可以清楚地看到,Noised(Boolean(0))只需将一个参数传递给外部函数, 而不向外部函数返回的内部函数传递任何内容


    真的很简单。现在我们明白了,很难相信它让我们一开始就这么头疼*/`

    Javascript变量没有静态数据类型。也可以为它们分配不同数据类型的变量

    JS中没有像JAVA等中那样的类型转换概念

    ()在函数调用中对应于函数的调用

    这里,布尔函数似乎是一个高阶函数,它作为参数传递给带噪函数。噪声功能的结果将是

    函数(arg){
    log(“调用”,arg);
    var=f(arg);
    log(“调用时使用”,arg,“-get”,val);
    返回val;
    
    };
    @Crowder:但是如果那些最初被封顶的东西(布尔值、数字、字符串等等)是函数,为什么var x=Number(5);警报(x类型);//数字警觉的
    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)