Cosa fa esattamente la funzione JavaScript anonimo f => f?


101

Sto usando una libreria di terze parti che ha una funzione che accetta le funzioni come argomenti. Sto eseguendo alcuni controlli condizionali per decidere se aggiungere o meno una particolare funzione come parametro e in alcuni casi non voglio fornire una funzione. Fornire null in questi casi genera un errore.

Ho trovato questo codice che funziona, ma non capisco completamente cosa sta succedendo.

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

È f => fequivalente a () => {}una funzione anonima vuota?


3
Restituisce un oggetto letterale f, secondo MDN
Eli Sadoff

4
non vuoto anonimo, è identità.
Davin Tryon

17
FWIW, puoi spesso inserire costrutti come questo in babel per vedere quali sono gli equivalenti nelle versioni precedenti di ECMAscript.
James Thorpe,


La risposta a stackoverflow.com/questions/24900875/… non risponde direttamente a questa domanda. Sapevo che f => f era una funzione anonima, semplicemente non capivo esattamente cosa stesse facendo. Penso che questa domanda sia un caso specifico e le informazioni fornite da Felix King sulle funzioni di identità sono uniche per questa domanda.
Qualcosa il

Risposte:


114

f => f è simile a function(f){ return f; }

Così vicino, ma non proprio quello che ti aspettavi.

* - come è stato sottolineato nei commenti, ci sono sottili differenze, ma per il bene della tua domanda, non credo che siano particolarmente rilevanti. Sono molto rilevanti in altre situazioni.


2
Mi vengono in mente almeno due differenze tra f => fe function(f) { return f; }:)
Benjamin Gruenbaum

6
@BenjaminGruenbaum cool, vai avanti - aggiorna anche questa risposta se pensi che sia rilevante.
Jamiec

4
Non penso che sia molto rilevante, solo un pedante: new (f => f)lanci, ha un diverso toStringe per qualche motivo non riesco a lamentarmi (f => f).argumentscon Chrome ma non FF o Edge.
Benjamin Gruenbaum

5
@BenjaminGruenbaum anche la gestione di thisè diversa. (anche se la differenza potrebbe non essere osservabile se thisnon appare nel corpo della funzione ... non ne sono sicuro)
Gregory Nisbet

184

f => fè la funzione di identità . Restituisce semplicemente l'argomento che è stato passato.

Questa funzione viene spesso utilizzata come valori predefiniti per i processi di trasformazione, poiché non esegue alcuna trasformazione.

È f => fequivalente a () => {}una funzione anonima vuota?

No. La funzione vuota non restituisce nulla. La funzione di identità restituisce l'argomento passato.


43
Un + per fornire nome, spiegazione e un caso d'uso e rispondere alla domanda effettiva.
Grazie


9

Altri hanno già menzionato cosa f => ffa, quindi non ho intenzione di approfondirlo. Spiegherò solo il resto della funzione, perché c'è una piccola differenza tra f => fe__DEV__ ? devTools() : f => f

L'operatore ternario controlla se __DEV__è un valore vero e, in tal caso, restituisce la funzione devTools(). in caso contrario, restituisce la funzione di identità f => fche non fa nulla. In altre parole: questo codice abilita alcune funzioni della modalità di sviluppo. Senza il codice rimanente, è difficile dire cosa aggiunge questa modalità, ma presumibilmente consentirà alcune informazioni di registrazione aggiuntive e meno offuscamento.


__DEV__ ? devTools() : f => fnon assegna nulla a f. Hai tralasciato qualcosa dall'esempio di codice?
Felix Kling

2
Non restituirà la funzione, restituirà il risultato della funzione
Stephan Bijzitter

1
Il tuo avatar mi infastidisce e disturba la mia giornata. Mi sento come se gli anni '90 e il mio modem abbiano perso la connessione. Comunque, +1 comunque, per una buona risposta.
Konrad Viltersten

@KonradViltersten Non sei il primo a commentare il mio avatar. Sei il primo a cui non piace però. La maggior parte delle persone ha apprezzato il fattore nostalgico e il piccolo sovvertimento delle aspettative che invoca.
Nzall

1
Spero che tu abbia capito l'ironia, amico. Era inteso come uno scherzo, ovviamente. Ovviamente mi piace e lo trovo piacevolmente originale.
Konrad Viltersten

9

In qualsiasi momento con un dilemma simile, puoi usare Babel per ottenere la risposta.

È tornato così:

"use strict";

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

BTW, => hai usato è la funzione ES6 chiamata espressione freccia . L'altra manifestazione di interesse

() => {};  // es6

convertirà in:

(function () {});

Poiché le espressioni della funzione freccia sono sempre anonime , ha senso aggiungere il nome alla funzione:

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

convertirà in

var empty = function empty() {}; 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.