匿名JavaScript函数f => f究竟做了什么?

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

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

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

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

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

如此接近,但不是你所期望的。

* – 正如在评论中指出的,有微妙的差异,但为了您的问题,我不认为他们是特别相关的。 他们在其他情况下非常相关。

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

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

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

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

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

 function(f) { return f * 2; } 

您所描述的代码将返回提供给它的任何input。

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

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

三元运算符检查__DEV__是否为真值,如果是,则返回函数devTools() 。 否则,它将返回不执行任何操作的身份函数f => f 。 换句话说:这段代码启用了一些开发模式function。 没有剩余的代码,很难说这个模式增加了什么,但是大概它会启用一些额外的日志logging信息和较less的混淆。

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

它像这样返回:

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

顺便说一下, =>你使用的是ES6function称为箭头expression式 。 另一个expression的兴趣

 () => {}; // es6 

会转换为:

 (function () {}); 

由于箭头函数expression式总是匿名的,所以如果你把这个名字添加到函数中,这是有意义的:

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

将转换为

 var empty = function empty() {};