【问题标题】:Callbacks and Higher Order functions Javascript回调和高阶函数 Javascript
【发布时间】:2015-02-20 19:14:10
【问题描述】:

这是Eloquent JS http://eloquentjavascript.net/05_higher_order.html第5章的问题

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)(12);
// → calling with 0
// → called with 0 - got false

有人能解释一下 f(arg) 的含义吗?我的意思是他在另一个参数 arg 上调用参数 f ?我很迷茫。

有返回值的部分怎么样;为什么必须在那里?当我删除它时,代码仍然可以正常运行。

最后,有人可以逐行解释代码解释吗?在示例中传递布尔值有何意义?

非常感谢

【问题讨论】:

    标签: javascript callback higher-order-functions


    【解决方案1】:

    要记住的一个简单规则是 Javascript 中的嵌套函数(例如,在其他函数中声明的函数)可以访问其父函数的所有变量和参数。

    noisy(f) 被调用并返回另一个函数时,它会在Javascript 中创建一个闭包。这意味着即使noisy(f) 已经完成执行,它的参数和任何局部变量仍然存在并且仍然可以被内部函数使用。

    因此,当调用该内部函数时,它可以完全访问先前执行其父函数时的f 参数。这是一个可能值得一读的MDN reference on closures 和一个解释闭包的StackOverflow answer

    那么,让我们逐步分解您的代码在做什么:

    function noisy(f) {
      return function(arg) {
         console.log("calling with", arg);
         var val = f(arg);
         console.log("called with", arg, "- got", val);
         return val;
       };
     }
    
    // split up noisy(Boolean)(12); into two steps
    var temp = noisy(Boolean);
    temp(12);
    

    当调用noisy(Boolean) 时,它会返回内部函数,并且对于该内部函数的任何未来调用,f 参数将设置为Boolean 构造函数。

    当返回的函数被调用时使用它自己的参数,如上面的temp(12),然后它最终执行Boolean(12)并返回它(谁的值将是true)。

    工作演示:http://jsfiddle.net/jfriend00/mkn839gu/

    【讨论】:

    • @YasharFeizi - 这回答了你的问题吗?由于看起来您可能是 StackOverflow 的新手,您是否知道如果您的问题得到了回答,那么您应该选择最佳答案并单击答案左侧的绿色复选标记。这将通知社区您的问题已得到回答,并为您和提供答案的人赢得一些声誉积分。
    【解决方案2】:

    基础知识:

    noisy 将一个函数映射到另一个函数,该函数的作用与原始函数相同,但会将输入和输出值(更准确地说是它们的字符串表示形式)写入控制台。

    • Q1:目的似乎是通过简单的日志记录工具来增强对象构造函数,以显示哪些初始化参数产生了哪种对象状态。为此,noisy 返回一个函数对象——通过输出到控制台增强的原始函数。

    • Q2:调用增强的Boolean 构造函数时未分配其返回值。因此,增强的构造函数是否返回值对代码没有影响。

    • Q3:Boolean 揭示了不同初始化参数的布尔值。我想要吸取的教训是0 的数字可以让你得到false,其他任何东西true(后者是我的猜测,但使用noisy,你有一个工具来一般检查对于任意构造函数和初始化值)。

    【讨论】:

      【解决方案3】:

      保持简单:

      函数噪声(充当包装器)中的参数实际上只是

      (Boolean());
      

      (for ref on boolean-type check this).

      此外,您在内部函数中使用0 作为console.log 的参数,
      并作为 Boolean() 的参数(在 var val 中)。


      有返回值的部分怎么样;为什么必须在那里?当我删除它时,代码仍然可以正常运行。

      只要您使用 console.log,您实际上并没有使用 return 语句,但是如果您要这样做

      console.log(noisy(Boolean)(0))
      

      可以看到前面console.logs后面的return语句

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-15
        相关资源
        最近更新 更多