匿名的JavaScript函数f => f到底是做什么的?

104

我正在使用一个第三方库,它有一个接受函数作为参数的函数。我正在进行一些条件检查,以决定是否将特定函数作为参数添加,但在某些情况下我不想提供函数。在这些情况下提供null会导致错误。

我发现了这段代码,它能正常运行,但我并不完全理解其中的原理。

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

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


3
根据MDN,它返回一个表示f的对象字面量。 - Eli Sadoff
4
非空的匿名,其实是身份的一种表现。 - Davin Tryon
17
顺便说一句,你经常可以将这样的结构放入Babel中,以查看在较旧版本的ECMAscript中的等效内容。链接为:https://babeljs.io/repl/#?babili=false&evaluate=true&lineWrap=false&presets=es2015&experimental=true&loose=false&spec=true&code=f%20%3D%3E%20f - James Thorpe
那个回答关于https://dev59.com/3WAf5IYBdhLWcg3wOQYL的问题并没有直接回答这个问题。我知道f => f是一个匿名函数,只是我不太理解它到底在做什么。我认为这个问题是一个特殊案例,Felix King提供的有关恒等函数的信息对这个问题来说是独一无二的。 - SomethingOn
显示剩余2条评论
5个回答

191

f => f恒等函数,它仅会返回传入的参数。

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

f => f() => {}一个空匿名函数等价吗?

不是。空函数没有返回值,而恒等函数返回传入的参数。


45
提供名称、解释和用例,回答实际问题,这样做得到 A+ 的评价。 - Mulan

114

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

很接近,但并不完全符合您的期望。

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


2
我至少能想到 f => ffunction(f) { return f; } 之间的两个不同之处 :) - Benjamin Gruenbaum
6
@BenjaminGruenbaum 很酷,继续前进 - 如果您认为相关,请更新此答案。 - Jamiec
4
我认为这并不是很相关,只是一个吹毛求疵的问题:new (f => f) 会抛出异常,它具有不同的 toString,但由于某种我无法理解的原因,(f => f).arguments 在 Chrome 中会抛出异常,而在 Firefox 或 Edge 中则不会。 - Benjamin Gruenbaum
5
@BenjaminGruenbaum 这里处理 this 的方式也有所不同(尽管如果函数体中没有出现 this 的话,这种差异可能无法观察到……我不确定)。 - Greg Nisbet
@BenjaminGruenbaum 嗯,根据当前规范,箭头函数本身不能有自己的caller/arguments属性,而在Function.prototype上的那些属性(参见CreateIntrinsics)被定义为在访问时抛出异常。也许2016年的情况不太精确? - SamB

19

9

其他人已经提到了f => f的含义,所以我不会深入解释。我只会解释函数的其余部分,因为f => f__DEV__ ? devTools() : f => f之间有一些差别。

三元运算符检查__DEV__是否为真值,如果是,则返回函数devTools(),否则返回什么也不做的标识函数f => f。换句话说:这段代码启用了一些开发模式函数。没有剩余的代码,很难确定此模式增加了什么,但可能会启用一些额外的日志信息和更少的混淆。


__DEV__ ? devTools() : f => f 不会给 f 赋值。你在代码示例中漏掉了什么吗? - Felix Kling
2
它不会返回函数本身,而是返回函数的结果。 - Stephan Bijzitter
1
你的头像很让我烦恼,打扰了我的一天。感觉就像是90年代,我的调制解调器失去了连接。不过,无论如何还是要点个赞,因为这是个好答案。 - Konrad Viltersten
@KonradViltersten,你不是第一个评论我的头像的人。但你是第一个不喜欢它的人。大多数人都欣赏它所带来的怀旧因素和小小的反转期望。 - Nzall
1
希望你能理解其中的讽刺意味,伙计。当然,这只是一个玩笑。显然,我很喜欢它,觉得它非常新颖。 - Konrad Viltersten

9

如果你遇到类似的问题,可以使用Babel获取答案。

返回结果如下:

"use strict";

(function (f) {
  return f;
});

顺便提一下,=> 是 ES6 中称为 箭头表达式 的特性。另一个值得关注的表达式

() => {};  // es6

将转换为:

(function () {});

由于箭头函数表达式始终是匿名的,因此如果您将名称添加到函数中,则会更有意义:
let empty = () => {}; // es6

将转换为

var empty = function empty() {}; 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接