2016-06-28 87 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