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

Som*_*gOn 100 javascript lambda ecmascript-6

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

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

compose(__DEV__ ? devTools() : f => f)
Run Code Online (Sandbox Code Playgroud)

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

Fel*_*ing 182

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

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

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

不.空功能不返回任何内容.identity函数返回传入的参数.

  • A+ for providing name, explanation, and a use case, and answering the actual question. (42认同)

Jam*_*iec 113

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

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

* - 正如评论中指出的那样,存在细微差别,但为了您的问题,我认为它们并不特别相关.它们在其他情况下非常相关.

  • @BenjaminGruenbaum很酷,继续 - 如果你认为它的相关性,甚至更新这个答案. (6认同)
  • @BenjaminGruenbaum对'this`的处理也不同.(虽然如果`this`没有出现在函数体中,差异可能是不可观察的......我不确定) (5认同)
  • 我不认为它是非常相关的,只是一个学究者:`new(f => f)`throws,它有一个不同的`toString`并且由于某种原因我不能理解`(f => f).arguments `投入Chrome而不是FF或Edge. (4认同)
  • I can think of at least two differences between `f => f` and `function(f) { return f; }` :) (2认同)

Yat*_*thi 19

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

function(f) { 
  return f * 2; 
}
Run Code Online (Sandbox Code Playgroud)

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

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


Nza*_*all 9

其他人已经提到了什么f => f,所以我不打算深入研究.我只是要解释函数的其余部分,因为f => f和之间有一些区别__DEV__ ? devTools() : f => f

三元运算符检查是否__DEV__为真值,如果是,则返回函数devTools().否则,它返回无效的标识功能f => f.换句话说:此代码启用了一些开发模式功能.如果没有剩下的代码,很难分辨出这种模式会增加什么,但可能会增加一些额外的日志记录信息并减少混淆.

  • 它不会返回该函数,它将返回函数的结果 (2认同)

pro*_*sti 9

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

它像这样返回:

"use strict";

(function (f) {
  return f;
});
Run Code Online (Sandbox Code Playgroud)

BTW,=>你使用的是ES6功能,称为箭头表达式.另一种感兴趣的表达方式

() => {};  // es6
Run Code Online (Sandbox Code Playgroud)

将转换为:

(function () {});
Run Code Online (Sandbox Code Playgroud)

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

let empty = () => {}; // es6
Run Code Online (Sandbox Code Playgroud)

将转换为

var empty = function empty() {}; 
Run Code Online (Sandbox Code Playgroud)