簡體   English   中英

Eloquent Javascript:高階函數

[英]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
  1. 由於 Noise() 只接受一個參數,即 (Boolean),如何將 (0) 傳遞給 Noise(f) ? 我可以看到內部函數 f(arg) 基本上是 Boolean(0),但我不明白如何將兩個參數傳遞給只允許一個參數的函數。 會“嘈雜(布爾)(0)(1)(2)(3);” 是一個有效的函數調用? 如果是這樣,您將如何區分嘈雜函數中布爾值之后的每個值? “arg”將引用哪個值?

  2. 書中指出示例函數正在修改另一個函數。 正在修改哪個功能? 我不明白作者所說的“修改”是什么意思。

但我不明白如何將兩個參數傳遞到只允許一個參數的函數中

noisy返回一個函數, Boolean被傳遞給noisy0被傳遞給從noisy返回的匿名函數,其中fBooleanval變成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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM