2016-06-28 88 views
0

我正在通过Eloquent Javascript:高阶函数下面的例子和已经阅读的问题和答案herehere。但我仍然很困惑。Eloquent Javascript:高阶函数

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 
  1. 如何(0)被传递到嘈杂的(F),因为嘈杂的()只需要一个参数,即(布尔)?我可以看到内部函数f(arg)基本上是布尔(0),但我不明白两个参数如何传入一个只允许一个参数的函数。会“嘈杂(布尔)(0)(1)(2)(3);”是一个有效的函数调用?如果是这样,在噪声函数中,如何区分布尔值后的每个值?哪个值将被“arg”引用?

  2. 该书指出示例函数正在修改另一个函数。哪个功能正在修改?我不明白作者的意思是“修改”。

+0

吵(F)返回一个函数,它有一个参数,ARG。用唯一的参数调用这个函数是完全有效的。 –

+0

[Javascript中的高阶函数]的可能重复(http://stackoverflow.com/questions/23535316/higher-order-functions-in-javascript) –

+0

也许'var ModifiedBoolean = noisy(Boolean); console.log(ModifiedBoolean(0))'更容易理解。虽然不是“修改”,“包装”一词可能会更好。 – Bergi

回答

0

这是currying在JavaScript在这里可以咖喱函数来返回部分应用功能或通过在其它功能

如何(0)被传递到所述概念嘈杂(f)因为嘈杂()只需要一个参数,那是(布尔)?

这个问题的答案是咖喱功能noisy()其期望的功能f作为参数并返回另一功能。返回的函数具有关闭而不是noisy,因此它可以确定Boolean作为参数传递给noisy,即使它返回后也是如此。这就是为什么叫noisy(Boolean)(0)基本上替代f=Boolean, arg=0

请参阅本作更多的讨好http://javascript.crockford.com/www_svendtofte_com/code/curried_javascript/关闭https://developer.mozilla.org/en/docs/Web/JavaScript/Closures

+0

感谢提及currying。另一种解释是:https://www.sitepoint.com/currying-in-functional-javascript/ – j7an

1

,但我不明白两个参数怎样才能传递到一个 功能,只允许一个参数

noisy返回功能,Boolean传递给noisy0传递到从noisy返回的匿名函数,其中fBooleanval变成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