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


101

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

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

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

f => f相当于() => {}一个空的匿名函数?


3
f根据MDN
Eli Sadoff

4
不是空的匿名,而是身份。
戴文·崔顿

17
FWIW,您通常可以将这样的构造放入babel中,以查看旧版ECMAscript中的等效项是什么。
詹姆斯·索普


对于stackoverflow.com/questions/24900875/…的答案并没有直接回答这个问题。我知道f => f是一个匿名函数,我只是不确切知道它在做什么。我认为这个问题是一个特定案例,Felix King提供的有关身份功能的信息是该问题所独有的。
SomethingOn

Answers:


114

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

如此接近,但与您期望的不尽相同。

*-正如评论中所指出的那样,存在细微的差异,但是出于您的问题,我认为它们之间没有特别的关系。它们在其他情况下非常相关。


2
我能想到的之间的至少两个差异f => ffunction(f) { return f; }:)
本杰明Gruenbaum

6
@BenjaminGruenbaum太好了,继续-甚至在您认为相关的情况下也更新此答案。
Jamiec '16

4
我认为这不是很相关,只是一个书呆子:new (f => f)抛出,它有所不同toString,由于某种原因,我不能完全理解(f => f).argumentsChrome中的异常抛出,但不是FF或Edge。
本杰明·格伦鲍姆

5
@BenjaminGruenbaum的处理this方式也不同。(尽管如果this不出现在函数体中,则可能无法观察到这种差异。。。我不确定)
Gregory Nisbet

184

f => f身份功能。它只是返回传入的参数。

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

f => f相当于() => {}一个空的匿名函数?

不。Empty函数不返回任何内容。身份函数返回传入的参数。


43
A +,用于提供名称,说明和用例,并回答实际问题。
谢谢您,


9

其他人已经提到了f => f做什么,所以我将不做进一步的介绍。我将只解释其余的功能,因为f => f和之间有一些区别__DEV__ ? devTools() : f => f

三元运算符检查是否__DEV__为真值,如果是,则返回function devTools()。否则,它返回f => f不执行任何操作的身份函数。换句话说:此代码启用某些开发模式功能。如果没有剩余的代码,很难说出此模式会增加什么,但是据推测,它将启用一些额外的日志记录信息并减少混淆。


__DEV__ ? devTools() : f => f不会为分配任何内容f。您是否在代码示例中遗漏了一些内容?
菲利克斯·克林

2
它不会返回函数,它将返回函数的结果
Stephan Bijzitter

1
你的头像让我烦恼,打乱了我的一天。我感觉像90年代,我的调制解调器失去了连接。不过,无论如何还是+1,这是一个很好的答案。
康拉德·维特尔斯滕

@KonradViltersten您不是第一个对我的头像发表评论的人。您是第一个不喜欢它的人。大多数人欣赏怀旧的因素以及它所引起的期望的微小颠覆。
Nzall

1
我希望你能讽刺,伙计。当然,这只是个玩笑。显然,我喜欢它,并发现它令人耳目一新。
Konrad Viltersten

9

任何时候只要遇到类似的难题,您都可以使用Babel来获得答案。

它返回如下:

"use strict";

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

顺便说一句,=>您使用的是称为箭头表达式的 ES6功能。感兴趣的另一种表达

() => {};  // es6

将转换为:

(function () {});

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

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

将转换为

var empty = function empty() {}; 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.