回调和高阶函数Javascript

时间:2015-02-20 19:14:10

标签: javascript callback higher-order-functions

这是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?我很迷茫。

返回val的部分怎么样;那为什么必须在那里?当我删除它时,代码仍然像它应该运行。

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

非常感谢

3 个答案:

答案 0 :(得分: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)并返回它(谁的值将是{ {1}})。

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

答案 1 :(得分:1)

基础:

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

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

  • Q2:调用增强的Boolean构造函数而不指定其返回值。因此,增强的构造函数是否确实返回值对代码没有影响。

  • 问题3:Boolean揭示了您为不同的初始化参数获得的布尔值。我想要吸取的教训是,0的数字会为您提供false,其他任何内容true(后者都会通过我自己的猜测,但noisy你有一个工具来一般检查任意构造函数和初始化值)。

答案 2 :(得分:0)

保持简单:

函数noisy中的参数(作为包装器)实际上只是

(Boolean());

(for ref on boolean-type check this).

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

  

返回val的部分怎么样;那为什么必须在那里?当我删除它时,代码仍然按照它应该运行。

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

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

您可以在上一个console.logs

之后看到return语句