匿名のJavaScript関数f => fは正確には何をしますか?


101

関数を引数として取る関数を持つサードパーティライブラリを使用しています。特定の関数をパラメーターとして追加するかどうかを決定するためにいくつかの条件チェックを行っています。場合によっては、関数を提供したくありません。その場合にnullを指定すると、エラーがスローされます。

動作するこのコードを見つけましたが、何が起こっているのか完全には理解していません。

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

であるf => fと同等の() => {}空の無名関数?


3
MDNfによると、オブジェクトリテラルを返します
Eli Sadoff

4
空の匿名ではなく、アイデンティティです。
Davin Tryon

17
FWIW、多くの場合このような構成をバベル貼り付けて、ECMAscriptの古いバージョンの同等のものを確認できます
James Thorpe


stackoverflow.com/questions/24900875/…に対するその回答は、この質問に直接回答するものではありません。私はf => fが匿名関数であることを知っていましたが、それが何をしているのか正確に理解できませんでした。この質問は特定のケースだと思います。アイデンティティ関数についてFelix Kingが提供する情報は、この質問に固有のものです。
SomethingOn

回答:


114

f => f と類似しています function(f){ return f; }

非常に近いですが、期待したものとはかなり異なります。

*-コメントで指摘されているように、微妙な違いがありますが、質問のために、それらは特に関連があるとは思いません。他の状況では非常に関連があります。


2
私はとの間に少なくとも2つの違いについて考えることができるf => ffunction(f) { return f; }:)
ベンジャミンGruenbaum

6
@BenjaminGruenbaumよろしくお願いします。関連があると思われる場合は、この回答を更新してください。
Jamiec、2016

4
私はそれはあまり関係がないと思います、ただのペダントです:new (f => f)スロー、それは異なってtoStringおり、何らかの理由(f => f).argumentsでChromeでスローを完全にグロブすることはできませんが、FFやEdge ではできません。
Benjamin Gruenbaum 2016

5
@BenjaminGruenbaumの取り扱いthisも異なります。(this関数本体に表示されない場合、違いは観察できないかもしれませんが...
わかり

184

f => fは、恒等関数です。渡された引数を返すだけです。

この関数は変換を実行しないため、変換プロセスのデフォルト値としてよく使用されます。

であるf => fと同等の() => {}空の無名関数?

いいえ。空の関数は何も返しません。識別関数は、渡された引数を返します。


43
A +は、名前、説明、および使用例を提供し、実際の質問に回答します。
ありがとう


9

他の人はすでに何をするかについて述べたf => fので、私はそれについて深く掘り下げるつもりはありません。差のビットがありますので、私はちょうど、機能の残りの部分を説明するつもりだf => fとは__DEV__ ? devTools() : f => f

三項演算子__DEV__は、真の値かどうかをチェックし、真の場合はfunctionを返しますdevTools()。そうでなければ、f => f何もしない恒等関数を返します。言い換えると、このコードはいくつかの開発モード機能を有効にします。残りのコードがないと、このモードが何を追加するのかを判断するのは困難ですが、おそらく、追加のログ情報を有効にし、難読化を減らすことができます。


__DEV__ ? devTools() : f => fには何も割り当てられませんf。コード例から何かを省きましたか?
Felix Kling 2016

2
関数は返されません。関数の結果が返されます
Stephan Bijzitter

1
あなたのアバターは私を困らせ、私の一日を邪魔します。90年代のように感じ、モデムが接続を失いました。それでも、+ 1といいます。
Konrad Viltersten、

@KonradVilterstenあなたは私のアバターにコメントする最初の人ではありません。あなたはそれを嫌う最初のものです。ほとんどの人はノスタルジックな要素とそれが引き起こす期待の小さな転覆を高く評価しました。
Nzall 16

1
あなたが皮肉な仲間を得たことを願っています。もちろん、それは冗談でした。明らかに、私はそれが好きで、それはすっきりと独創的だと思います。
Konrad Viltersten 16

9

同様のジレンマがあればいつでも、Babelを使用して答えを得ることができます。

それはこのように戻りました:

"use strict";

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

ところで、使用した=>は、矢印式と呼ばれるES6の機能です。興味のある他の表現

() => {};  // es6

に変換されます:

(function () {});

アロー関数式は常に匿名であるため、関数に名前を追加すると意味があります。

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

に変換します

var empty = function empty() {}; 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.