这是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的部分怎么样;那为什么必须在那里?当我删除它时,代码仍然像它应该运行。
最后,有人可以逐行解释代码解释吗?传递布尔值如何在示例中有意义?
非常感谢
答案 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}})。
答案 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语句