解释 "you can have functions that change other functions"

Explain "you can have functions that change other functions"

我正在通读 Eloquent JavaScript,当我在第 5 章看到这个时。:

you can have functions that create new functions.

function greaterThan(n) {
  return function(m) { return m > n; };
}
var greaterThan10 = greaterThan(10);

And you can have functions that change other functions.

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

我的问题是:

How are the above two examples different?

greaterThan 接受一个参数,n,它是一个数字。

noisy 接受一个参数,f,它是一个函数,然后可以在其中调用。

其中 greaterThan 只计算一个数字,noisy 更灵活,因为它可以接受任何函数并执行它。

How does noisy change Boolean?

noisy returns 一个匿名函数,它在将结果存储在名为 val.

的行中计算 Boolean

不同之处在于 noisy 的参数是另一个函数,而不是像数字那样的 "plain" 值。所以,是的,它创建了一个新的匿名函数,就像 greaterThan 所做的那样,但它是对修改其行为的现有函数的包装。

在这种情况下,包装器只是在调用原始函数之前和之后记录一些消息 f。但是你可以做其他的事情,比如修改它的参数或者它的 return 值。例如,您可以实现 partial function application,它允许您在程序中的某个位置为函数调用提供 一些 参数,并在 "remember" 中提供这些参数一个新函数,稍后只接受剩余的参数。