[英]Eloquent Javascript: Higher Order Functions
我正在閱讀 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
由於 Noise() 只接受一個參數,即 (Boolean),如何將 (0) 傳遞給 Noise(f) ? 我可以看到內部函數 f(arg) 基本上是 Boolean(0),但我不明白如何將兩個參數傳遞給只允許一個參數的函數。 會“嘈雜(布爾)(0)(1)(2)(3);” 是一個有效的函數調用? 如果是這樣,您將如何區分嘈雜函數中布爾值之后的每個值? “arg”將引用哪個值?
書中指出示例函數正在修改另一個函數。 正在修改哪個功能? 我不明白作者所說的“修改”是什么意思。
但我不明白如何將兩個參數傳遞到只允許一個參數的函數中
noisy
返回一個函數, Boolean
被傳遞給noisy
, 0
被傳遞給從noisy
返回的匿名函數,其中f
是Boolean
, val
變成Boolean(0)
。
例如
function fn1(arg1) {
return function fn2(arg2) {
console.log(arg1, arg2)
}
}
// Call fn1, inside fn1 fn2 is called with `"b"` as parameter.
fn1("a")("b") // `a b`, `fn2`
這是 JavaScript 中currying
的概念,您可以currying
函數以返回部分應用的函數或傳入其他函數
由於 Noise() 只接受一個參數,即 (Boolean),如何將 (0) 傳遞給 Noise(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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.