O que exatamente a função JavaScript anônima f => f faz?

101

Estou usando uma biblioteca de terceiros que tem uma função que usa funções como argumentos. Estou fazendo algumas verificações condicionais para decidir se devo ou não adicionar uma função específica como um parâmetro e, em alguns casos, não desejo fornecer uma função. Fornecer nulo nesses casos gera um erro.

Eu encontrei este código que funciona, mas não entendo totalmente o que está acontecendo.

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

É f => fequivalente a () => {}uma função anônima vazia?

SomethingOn
fonte
3
Ele retorna um objeto literal de f, de acordo com MDN
Eli Sadoff
4
não anônimo vazio, é identidade.
Davin Tryon
17
FWIW, muitas vezes você pode inserir construções como essa no babel para ver quais são os equivalentes em versões anteriores do ECMAscript.
James Thorpe
Essa resposta para stackoverflow.com/questions/24900875/… não responde diretamente a esta pergunta. Eu sabia que f => f era uma função anônima, mas não entendia exatamente o que ela estava fazendo. Acho que esta questão é um caso específico e as informações fornecidas por Felix King sobre as funções de identidade são exclusivas para esta questão.
Algo em

Respostas:

114

f => f é similar a function(f){ return f; }

Tão perto, mas não exatamente o que você esperava.

* - como foi apontado nos comentários, existem diferenças sutis, mas para o bem da sua pergunta, não acho que sejam particularmente relevantes. Eles são muito relevantes em outras situações.

Jamiec
fonte
2
Posso pensar em pelo menos duas diferenças entre f => fe function(f) { return f; }:)
Benjamin Gruenbaum
6
@BenjaminGruenbaum legal, vá em frente - atualize esta resposta se você achar que é relevante.
Jamiec de
4
Não acho que seja muito relevante, apenas um pedante: new (f => f)arremessos, tem um diferente toStringe por algum motivo não consigo grocar (f => f).argumentsarremessos no Chrome, mas não no FF ou no Edge.
Benjamin Gruenbaum
5
@BenjaminGruenbaum o manuseio thistambém é diferente. (embora a diferença possa não ser observável se thisnão aparecer no corpo da função ... Não tenho certeza)
Gregory Nisbet
184

f => f é o função de identidade . Ele simplesmente retorna o argumento que foi passado.

Esta função é freqüentemente usada como um valor padrão para processos de transformação, uma vez que não realiza nenhuma transformação.

É f => fequivalente a () => {}uma função anônima vazia?

Não. A função vazia não retorna nada. A função de identidade retorna o argumento passado.

Felix Kling
fonte
43
A + para fornecer nome, explicação e um caso de uso e responder à pergunta real.
Obrigado
9

Outros já mencionaram o que f => fsignifica, então não vou me aprofundar nisso. Vou apenas explicar o resto da função, porque há uma pequena diferença entre f => fe__DEV__ ? devTools() : f => f

O operador ternário verifica se __DEV__é um valor verdadeiro e, em caso afirmativo, retorna a função devTools(). caso contrário, ele retorna a função de identidade f => fque não faz nada. Colocado de outra forma: este código permite algumas funções do modo de desenvolvimento. Sem o código restante, é difícil dizer o que esse modo adiciona, mas presumivelmente, ele permitirá algumas informações extras de registro e menos ofuscação.

Nzall
fonte
__DEV__ ? devTools() : f => fnão atribui nada a f. Você deixou algo de fora do exemplo de código?
Felix Kling
2
Ele não retornará a função, ele retornará o resultado da função
Stephan Bijzitter
1
Seu avatar me irrita e atrapalha meu dia. Eu me sinto como nos anos 90 e meu modem perdeu a conexão. Ainda assim, +1 de qualquer maneira, para uma boa resposta.
Konrad Viltersten
@KonradViltersten Você não é o primeiro a comentar sobre o meu avatar. Você é o primeiro que não gosta disso. A maioria das pessoas apreciou o fator nostálgico e a pequena subversão de expectativas que ele invoca.
Nzall
1
Espero que você tenha entendido a ironia, cara. Era uma piada, é claro. Obviamente, eu gosto e acho que é revigorante e original.
Konrad Viltersten
9

A qualquer momento com o dilema semelhante, você pode usar Babel para obter a resposta.

Retornou assim:

"use strict";

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

BTW, => você usou é o recurso ES6 chamado expressão de seta . A outra expressão de interesse

() => {};  // es6

seria convertido para:

(function () {});

Como as expressões da função de seta são sempre anônimas , faz sentido adicionar o nome à função:

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

iria converter para

var empty = function empty() {}; 
Prosti
fonte