【问题标题】:Explain "you can have functions that change other functions"解释“你可以拥有改变其他功能的功能”
【发布时间】:2015-07-25 03:26:40
【问题描述】:

我正在阅读Eloquent JavaScript,当时我在第 5 章中遇到了这个问题。:

你可以拥有创建新函数的函数。

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

你可以拥有改变其他功能的功能。

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

我的问题是:

  • 以上两个示例有何不同?
  • noisy如何改变Boolean

【问题讨论】:

  • 我认为这只是措辞不当。我认为它试图说明的一点是,您可以通过将函数传递给另一个函数来使用回调。所涉及的“变化”实际上是它正在消耗回调的结果并对其进行修改。
  • “更改其他功能”似乎具有误导性,即使它试图“简化”操作概念;功能是一样的。最好将其表达为“并且您可以拥有使用(通过包装)其他功能的功能..”

标签: javascript higher-order-functions


【解决方案1】:

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

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

【讨论】:

  • 很难认为这是正确的答案,直到明确说“更改功能”介于误导和错误之间。
【解决方案2】:

以上两个例子有何不同?

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

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

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

嘈杂如何改变布尔值?

noisy 返回一个匿名函数,该函数在将结果存储在名为val 的变量中的行中计算Boolean

【讨论】:

  • 因此嘈杂不会改变布尔值(或它最初引用的函数)..
  • 正确!它不会改变它。
  • 那么引用 trying 的意思是什么?
  • noisy(Boolean)(0) 执行noisyBoolean 作为f 参数,0 作为传入Boolean 的参数。 0 总是返回虚假。如果这不能回答你的问题,恐怕你没有正确地表达它。
猜你喜欢
  • 1970-01-01
  • 2020-04-20
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 2015-01-06
相关资源
最近更新 更多