这是 Eloquent JS 第 5 章的问题 http://eloquentjavascript.net/05_higher_order.html
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 ?我很困扰。
有返回值的部分怎么样;为什么它必须在那里?当我删除它时,代码仍然按预期运行。
最后,可以逐行解释一下代码解释吗?在示例中传递 bool 值有何意义?
非常感谢
最佳答案
要记住的一个简单规则是 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)
时,将返回内部函数,并且对于该内部函数的任何 future 调用,f
参数将设置为 bool
构造函数。
当使用它自己的参数调用返回的函数时,如上面的 temp(12)
所示,它最终会执行 Boolean(12)
并返回该值(谁是值将为true
)。
关于javascript - 回调和高阶函数 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28636522/