Was genau macht die anonyme JavaScript-Funktion f => f?

101

Ich verwende eine Drittanbieter-Bibliothek mit einer Funktion, die Funktionen als Argumente verwendet. Ich mache einige bedingte Überprüfungen, um zu entscheiden, ob eine bestimmte Funktion als Parameter hinzugefügt werden soll oder nicht, und in einigen Fällen möchte ich keine Funktion bereitstellen. Wenn Sie in diesen Fällen null angeben, wird ein Fehler ausgegeben.

Ich habe diesen Code gefunden, der funktioniert, aber ich verstehe nicht ganz, was passiert.

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

Ist f => fäquivalent zu () => {}einer leeren anonymen Funktion?

Etwas auf
quelle
3
Es gibt ein Objektliteral von flaut MDN
Eli Sadoff
4
nicht leer anonym, es ist Identität.
Davin Tryon
17
FWIW, Sie können häufig Konstrukte wie dieses in babel stecken, um zu sehen, welche Entsprechungen in älteren Versionen von ECMAscript vorliegen.
James Thorpe
Diese Antwort auf stackoverflow.com/questions/24900875/… beantwortet diese Frage nicht direkt. Ich wusste, dass f => f eine anonyme Funktion ist. Ich habe einfach nicht genau verstanden, was sie tut. Ich denke, diese Frage ist ein spezieller Fall und die Informationen von Felix King über Identitätsfunktionen sind für diese Frage einzigartig.
Etwas

Antworten:

114

f => f ist ähnlich wie function(f){ return f; }

So nah, aber nicht ganz das, was Sie erwartet hatten.

* - Wie in den Kommentaren erwähnt, gibt es subtile Unterschiede, aber für Ihre Frage halte ich sie nicht für besonders relevant. Sie sind in anderen Situationen sehr relevant.

Jamiec
quelle
2
Ich kann mir mindestens zwei Unterschiede zwischen f => fund function(f) { return f; }vorstellen :)
Benjamin Gruenbaum
6
@BenjaminGruenbaum cool, mach weiter - aktualisiere diese Antwort sogar, wenn du denkst, dass sie relevant ist.
Jamiec
4
Ich denke nicht, dass es sehr relevant ist, nur ein Pedant: new (f => f)Würfe, es hat einen anderen toStringund aus irgendeinem Grund kann ich (f => f).argumentsWürfe in Chrome nicht ganz grok, aber nicht FF oder Edge.
Benjamin Gruenbaum
5
@BenjaminGruenbaum der Umgang mit thisist auch anders. (obwohl der Unterschied möglicherweise nicht erkennbar ist, wenn er thisnicht im Funktionskörper erscheint ... Ich bin nicht sicher)
Gregory Nisbet
184

f => fist die Identitätsfunktion . Es wird einfach das übergebene Argument zurückgegeben.

Diese Funktion wird häufig als Standardwert für Transformationsprozesse verwendet, da keine Transformation durchgeführt wird.

Ist f => fgleichbedeutend mit() => {}einer leeren anonymen Funktion?

Nein, die leere Funktion gibt nichts zurück. Die Identitätsfunktion gibt das übergebene Argument zurück.

Felix Kling
quelle
43
A + für die Angabe von Name, Erklärung und Anwendungsfall sowie für die Beantwortung der eigentlichen Frage.
Vielen Dank, dass Sie
9

Andere haben bereits erwähnt, was f => ftut, deshalb werde ich nicht näher darauf eingehen. Ich werde nur den Rest der Funktion erklären, weil es einen kleinen Unterschied zwischen f => fund gibt__DEV__ ? devTools() : f => f

Der ternäre Operator prüft, ob __DEV__es sich um einen Wahrheitswert handelt, und gibt in diesem Fall die Funktion zurück devTools(). Andernfalls wird die Identitätsfunktion zurückgegeben, f => fdie nichts bewirkt. Anders ausgedrückt: Dieser Code aktiviert einige Funktionen des Entwicklungsmodus. Ohne den verbleibenden Code ist es schwer zu sagen, was dieser Modus hinzufügt, aber vermutlich werden dadurch einige zusätzliche Protokollierungsinformationen und weniger Verschleierung ermöglicht.

Nzall
quelle
__DEV__ ? devTools() : f => fweist nichts zu f. Haben Sie etwas aus dem Codebeispiel weggelassen?
Felix Kling
2
Es wird nicht die Funktion zurückgeben, es wird das Ergebnis der Funktion zurückgeben
Stephan Bijzitter
1
Dein Avatar nervt mich und stört meinen Tag. Ich fühle mich wie in den 90ern und mein Modem hat die Verbindung verloren. Trotzdem +1 für eine gute Antwort.
Konrad Viltersten
@KonradViltersten Du bist nicht der erste, der meinen Avatar kommentiert. Du bist der erste, der es nicht mag. Die meisten Menschen schätzten den nostalgischen Faktor und die geringe Subversion der damit verbundenen Erwartungen.
Nzall
1
Ich hoffe, dass du die Ironie hast, Kumpel. Es war natürlich als Witz gedacht. Offensichtlich gefällt es mir und ich finde es erfrischend originell.
Konrad Viltersten
9

Mit dem ähnlichen Dilemma können Sie jederzeit Babel verwenden , um die Antwort zu erhalten.

Es kehrte so zurück:

"use strict";

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

BTW, => verwendet man wird ES6 genannt Feature Pfeil Ausdruck . Die andere Interessenbekundung

() => {};  // es6

würde konvertieren zu:

(function () {});

Da Pfeilfunktionsausdrücke immer anonym sind, ist es sinnvoll, wenn Sie der Funktion den Namen hinzufügen:

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

würde konvertieren zu

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