【问题标题】:What exactly does the anonymous JavaScript function f => f do?匿名 JavaScript 函数 f => f 究竟做了什么?
【发布时间】:2017-05-05 21:30:44
【问题描述】:

我正在使用一个第三方库,该库有一个将函数作为参数的函数。我正在做一些条件检查来决定是否添加一个特定的函数作为参数,在某些情况下我不想提供一个函数。在这种情况下提供 null 会引发错误。

我发现这段代码有效,但我不完全理解发生了什么。

compose(__DEV__ ? devTools() : f => f)

f => f 是否等同于 () => {} 一个空的匿名函数?

【问题讨论】:

标签: javascript lambda ecmascript-6


【解决方案1】:

f => fidentity function。它只是返回传入的参数。

此函数通常用作转换过程的默认值,因为它不执行任何转换。

f => f 是否等同于 () => {} 一个空的匿名函数?

没有。空函数不返回任何内容。标识函数返回传入的参数。

【讨论】:

  • A+ 用于提供名称、解释和用例,并回答实际问题。
【解决方案2】:

f => f 类似于* function(f){ return f; }

如此接近,但并不完全符合您的预期。

* - 正如在 cmets 中所指出的,存在细微的差异,但为了您的问题,我认为它们 特别 不相关。它们在其他情况下非常相关。

【讨论】:

  • 我能想到f => ffunction(f) { return f; } 之间的至少两个区别:)
  • @BenjaminGruenbaum 很酷,继续 - 如果您认为它相关,甚至更新此答案。
  • 我认为这不是很相关,只是一个学究:new (f => f) throws,它有一个不同的 toString 并且由于某种原因我不能完全理解 (f => f).arguments throws 在 Chrome 但是不是 FF 或 Edge。
  • @BenjaminGruenbaum this 的处理方式也不同。 (尽管如果 this 没有出现在函数体中,则可能无法观察到差异......我不确定)
【解决方案3】:

如果你想知道f => f是什么意思,左边是参数,右边是返回值。比如f => f*2,就等价于:

function(f) { 
  return f * 2; 
}

您描述的代码返回作为输入提供给它的任何内容。

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions

【讨论】:

    【解决方案4】:

    其他人已经提到了f => f 的作用,所以我不打算深入探讨。我只是解释一下函数的其余部分,因为f => f__DEV__ ? devTools() : f => f之间有一点区别

    三元运算符检查__DEV__是否为真值,如果是,则返回函数devTools()。否则,它返回标识函数f => f,它什么都不做。换句话说:这段代码启用了一些开发模式功能。如果没有剩下的代码,很难说这种模式添加了什么,但大概会启用一些额外的日志信息并减少混淆。

    【讨论】:

    • __DEV__ ? devTools() : f => f 没有为f 分配任何内容。您是否从代码示例中遗漏了什么?
    • 不会返回函数,会返回函数的结果
    • 你的头像惹恼了我,扰乱了我的一天。我感觉就像 90 年代和我的调制解调器失去了连接。不过,无论如何,+1,以获得一个好的答案。
    • @KonradViltersten 你不是第一个对我的头像发表评论的人。你是第一个不喜欢它的人。大多数人都欣赏怀旧因素和它引发的对预期的小幅颠覆。
    • 我希望你得到了讽刺,伙计。当然,这只是一个玩笑。显然,我喜欢它,而且我觉得它很新颖。
    【解决方案5】:

    任何时候遇到类似的困境,你都可以使用Babel得到答案。

    返回如下:

    "use strict";
    
    (function (f) {
      return f;
    });
    

    顺便说一句,您使用的 => 是名为 arrow expression 的 ES6 功能。 另一种兴趣表达

    () => {};  // es6
    

    将转换为:

    (function () {});
    

    由于箭头函数表达式始终是匿名的,因此将名称添加到函数中是有意义的:

    let empty = () => {}; // es6
    

    将转换为

    var empty = function empty() {}; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 2012-07-23
      • 2016-09-10
      • 2023-03-15
      • 2012-10-17
      • 2021-06-04
      相关资源
      最近更新 更多