我正在阅读下面的Eloquent Javascript:高阶函数示例,并且已经阅读了问题和答案here和here。但我仍然很困惑。
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
如果将(0)传递给嘈杂的(f),因为noisy()只接受一个参数,那就是(布尔)?我可以看到内部函数f(arg)基本上是布尔值(0),但我不明白如何将两个参数传递给只允许一个参数的函数。将“嘈杂(布尔)(0)(1)(2)(3);”是一个有效的函数调用?如果是这样,在嘈杂函数中如何区分布尔值后的每个值?哪个值将被“arg”引用?
书中注意到示例函数正在修改另一个函数。哪个功能正在修改?我不明白作者对“修改”的意思。
答案 0 :(得分:1)
但我不明白两个参数如何传递到a 只允许一个参数的函数
noisy
返回一个函数,Boolean
传递给noisy
,0
传递给noisy
返回的匿名函数,其中f
是Boolean
,val
变为Boolean(0)
。
例如
function fn1(arg1) {
return function fn2(arg2) {
console.log(arg1, arg2)
}
}
fn("a")("b") // `a b`, `fn2` is called with `"b"` as parameter
答案 1 :(得分:0)
这是JavaScript中currying
的概念,您可以在其中调用函数以返回部分应用的函数或传入其他函数
如何将(0)传递到噪声(f),因为noisy()只接受一个参数,那就是(布尔)?
对此的回答是curried函数noisy()
,它将函数f
作为参数并返回另一个函数。返回的函数在noisy
上有一个闭包,因此即使在返回后,它也可以识别Boolean
作为参数传递给noisy
。这就是为什么调用noisy(Boolean)(0)
基本上替代f=Boolean, arg=0
有关 currying :http://javascript.crockford.com/www_svendtofte_com/code/curried_javascript/和关闭的更多信息,请参阅此处:https://developer.mozilla.org/en/docs/Web/JavaScript/Closures