Co dokładnie robi anonimowa funkcja JavaScript f => f?

101

Używam biblioteki innej firmy, która ma funkcję, która przyjmuje funkcje jako argumenty. Wykonuję pewne kontrole warunkowe, aby zdecydować, czy dodać określoną funkcję jako parametr, aw niektórych przypadkach nie chcę udostępniać funkcji. Podanie wartości null w takich przypadkach powoduje zgłoszenie błędu.

Znalazłem ten kod, który działa, ale nie do końca rozumiem, co się dzieje.

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

Czy jest f => fodpowiednikiem () => {}pustej funkcji anonimowej?

SomethingOn
źródło
3
Zwraca obiekt dosłownie f, według MDN
Eli Sadoff,
4
nie pusty anonimowy, to tożsamość.
Davin Tryon
17
FWIW, często możesz wkleić takie konstrukcje do babel, aby zobaczyć, jakie są odpowiedniki w starszych wersjach ECMAscript.
James Thorpe,
Ta odpowiedź na stackoverflow.com/questions/24900875/… nie odpowiada bezpośrednio na to pytanie. Wiedziałem, że f => f to funkcja anonimowa, po prostu nie rozumiałem dokładnie, co robi. Myślę, że to pytanie jest szczególnym przypadkiem, a informacje dostarczone przez Felixa Kinga na temat funkcji tożsamości są unikalne dla tego pytania.
Coś

Odpowiedzi:

114

f => f jest podobne do function(f){ return f; }

Tak blisko, ale nie do końca to, czego się spodziewałeś.

* - jak wskazano w komentarzach, istnieją subtelne różnice, ale ze względu na Twoje pytanie nie sądzę, aby były one szczególnie istotne. Są bardzo istotne w innych sytuacjach.

Jamiec
źródło
2
f => ffunction(f) { return f; }
Przychodzą mi do głowy
6
@BenjaminGruenbaum spoko, śmiało - nawet zaktualizuj tę odpowiedź, jeśli uważasz, że jest ona odpowiednia.
Jamiec
4
Nie sądzę, żeby to było bardzo istotne, po prostu pedant: new (f => f)rzuca, ma inny toStringiz jakiegoś powodu nie mogę całkiem grokować (f => f).argumentsrzuca w Chrome, ale nie FF lub Edge.
Benjamin Gruenbaum
5
@BenjaminGruenbaum obsługa thisjest również inna. (chociaż różnica może nie być zauważalna, jeśli thisnie pojawia się w treści funkcji ... nie jestem pewien)
Gregory Nisbet
184

f => fjest funkcją tożsamości . Po prostu zwraca argument, który został przekazany.

Ta funkcja jest często używana jako wartość domyślna dla procesów transformacji, ponieważ nie wykonuje żadnej transformacji.

Czy jest f => fodpowiednikiem () => {}pustej funkcji anonimowej?

Nie. Pusta funkcja nic nie zwraca. Funkcja tożsamości zwraca przekazany argument.

Felix Kling
źródło
43
+ Za podanie nazwy, wyjaśnienia i przypadku użycia oraz odpowiedź na rzeczywiste pytanie.
Dziękuję
9

Inni już wspomnieli, co to f => frobi, więc nie zamierzam się w to zagłębiać. Wyjaśnię tylko pozostałą część funkcji, ponieważ między f => fi jest pewna różnica__DEV__ ? devTools() : f => f

Operator trójargumentowy sprawdza, czy __DEV__jest to prawdziwa wartość, a jeśli tak, zwraca funkcję devTools(). w przeciwnym razie zwraca funkcję tożsamości, f => fktóra nic nie robi. Mówiąc inaczej: ten kod włącza niektóre funkcje w trybie programistycznym. Bez pozostałego kodu trudno powiedzieć, co dodaje ten tryb, ale prawdopodobnie umożliwi on dodatkowe informacje o rejestrowaniu i mniej zaciemniania.

Nzall
źródło
__DEV__ ? devTools() : f => fniczego nie przypisuje f. Czy pominąłeś coś z przykładu kodu?
Felix Kling
2
Nie zwróci funkcji, zwróci wynik funkcji
Stephan Bijzitter
1
Twój awatar denerwuje mnie i zakłóca mój dzień. Czuję się jak w latach 90-tych i mój modem stracił połączenie. Mimo to +1 za dobrą odpowiedź.
Konrad Viltersten
@KonradViltersten Nie jesteś pierwszą osobą, która skomentowała mój awatar. Ale jesteś pierwszym, któremu się to nie podoba. Większość ludzi doceniała nostalgiczny czynnik i niewielkie odwrócenie oczekiwań, które on wywołuje.
Nzall
1
Mam nadzieję, że masz ironię, kolego. Oczywiście miał to być żart. Oczywiście podoba mi się i uważam, że jest odświeżająco oryginalny.
Konrad Viltersten
9

Zawsze, gdy masz podobny dylemat, możesz skorzystać z Babel, aby uzyskać odpowiedź.

Wróciło tak:

"use strict";

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

BTW, => użyłeś funkcji ES6 zwanej wyrażeniem strzałki . Inny wyraz zainteresowania

() => {};  // es6

przekształciłby się w:

(function () {});

Ponieważ wyrażenia funkcji strzałkowych są zawsze anonimowe , ma sens, jeśli dodasz nazwę do funkcji:

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

konwertowałoby się na

var empty = function empty() {}; 
prosti
źródło