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?


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.


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.


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.


__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() {}; 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.