代码之家  ›  专栏  ›  技术社区  ›  kchak

解释“您可以拥有改变其他功能的功能”

  •  9
  • kchak  · 技术社区  · 9 年前

    我正在通读 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
    

    我的问题是:

    • 以上两个例子有何不同?
    • 如何 吵闹的 改变 布尔型 ?
    2 回复  |  直到 9 年前
        1
  •  4
  •   Wyzard    9 年前

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

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

        2
  •  1
  •   Richard Kho    9 年前

    以上两个例子有何不同?

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

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

    哪里 大于 仅评估数字, 吵闹的 更灵活,因为它可以接受任何函数并执行它。

    噪声如何改变布尔值?

    吵闹的 返回一个匿名函数,该函数计算 Boolean 在该行中,它将结果存储在一个名为 val .