Apa sebenarnya yang dilakukan fungsi JavaScript anonim f => f?

101

Saya menggunakan pustaka pihak ketiga yang memiliki fungsi yang mengambil fungsi sebagai argumen. Saya melakukan beberapa pemeriksaan bersyarat untuk memutuskan apakah akan menambahkan fungsi tertentu sebagai parameter atau tidak dan dalam beberapa kasus saya tidak ingin menyediakan fungsi. Memberikan null dalam kasus tersebut akan memunculkan error.

Saya menemukan kode ini yang berfungsi, tetapi saya tidak sepenuhnya memahami apa yang terjadi.

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

Apakah f => fsetara dengan () => {}fungsi anonim kosong?

SomethingOn
sumber
3
Ini mengembalikan literal objek f, menurut MDN
Eli Sadoff
4
bukan tanpa nama kosong, itu adalah identitas.
Davin Tryon
17
FWIW, Anda sering dapat menempelkan konstruksi seperti ini ke dalam babel untuk melihat apa yang setara di ECMAscript versi lama.
James Thorpe
Jawaban stackoverflow.com/questions/24900875/… itu tidak langsung menjawab pertanyaan ini. Saya tahu f => f adalah fungsi anonim. Saya hanya tidak mengerti persis apa yang dilakukannya. Saya pikir pertanyaan ini adalah kasus khusus dan informasi yang diberikan oleh Felix King tentang fungsi identitas adalah unik untuk pertanyaan ini.
Sesuatu Pada

Jawaban:

114

f => f mirip * dengan function(f){ return f; }

Sangat dekat, tapi tidak seperti yang Anda harapkan.

* - seperti yang telah ditunjukkan dalam komentar, ada perbedaan kecil, tetapi demi pertanyaan Anda, menurut saya perbedaan tersebut tidak terlalu relevan. Mereka sangat relevan dalam situasi lain.

Jamiec
sumber
2
Saya dapat memikirkan setidaknya dua perbedaan antara f => fdan function(f) { return f; }:)
Benjamin Gruenbaum
6
@BenjaminGruenbaum keren, lanjutkan - bahkan perbarui jawaban ini jika menurut Anda itu relevan.
Jamiec
4
Saya tidak berpikir itu sangat relevan, hanya pedant: new (f => f)lemparan, itu berbeda toStringdan untuk beberapa alasan saya tidak bisa (f => f).argumentsmelempar di Chrome tetapi tidak FF atau Edge.
Benjamin Gruenbaum
5
@BenjaminGruenbaum penanganannya thisjuga beda. (meskipun perbedaannya mungkin tidak dapat diamati jika thistidak muncul di badan fungsi ... Saya tidak yakin)
Gregory Nisbet
184

f => fadalah fungsi identitas . Ini hanya mengembalikan argumen yang diteruskan.

Fungsi ini sering digunakan sebagai nilai default untuk proses transformasi, karena tidak melakukan transformasi apa pun.

Apakah f => fsetara dengan () => {}fungsi anonim kosong?

Tidak. Fungsi kosong tidak mengembalikan apapun. Fungsi identitas mengembalikan argumen yang diteruskan.

Felix Kling
sumber
43
A + untuk memberikan nama, penjelasan, dan use case, serta menjawab pertanyaan sebenarnya.
Terima kasih
9

Orang lain telah menyebutkan apa yang dimaksud f => f, jadi saya tidak akan membahasnya lebih dalam. Saya hanya akan menjelaskan fungsi lainnya, karena ada sedikit perbedaan antara f => fdan__DEV__ ? devTools() : f => f

Operator terner memeriksa apakah __DEV__nilai yang benar, dan jika demikian, itu mengembalikan fungsi devTools(). jika tidak, ia mengembalikan fungsi identitas f => fyang tidak melakukan apa-apa. Dengan kata lain: kode ini mengaktifkan beberapa fungsi mode pengembangan. Tanpa kode yang tersisa, sulit untuk mengetahui apa yang ditambahkan mode ini, tetapi mungkin, ini akan mengaktifkan beberapa informasi logging tambahan dan lebih sedikit kebingungan.

Nzall
sumber
__DEV__ ? devTools() : f => ftidak menugaskan apapun f. Apakah Anda melewatkan sesuatu dari contoh kode?
Felix Kling
2
Ini tidak akan mengembalikan fungsi, itu akan mengembalikan hasil dari fungsi
Stephan Bijzitter
1
Avatar Anda mengganggu saya dan mengganggu hari saya. Saya merasa seperti tahun 90-an dan modem saya kehilangan koneksi. Tetap saja, tetap +1, untuk jawaban yang bagus.
Konrad Viltersten
@KonradVersten Anda bukan orang pertama yang mengomentari avatar saya. Anda adalah orang pertama yang tidak menyukainya. Kebanyakan orang menghargai faktor nostalgia dan subversi kecil dari harapan yang ditimbulkannya.
Nzall
1
Saya harap Anda mendapatkan ironi, sobat. Itu dimaksudkan sebagai lelucon, tentu saja. Jelas, saya menyukainya dan menurut saya ini sangat orisinal.
Konrad Viltersten
9

Kapan pun dengan dilema serupa, Anda dapat menggunakan Babel untuk mendapatkan jawabannya.

Ini kembali seperti ini:

"use strict";

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

BTW, => yang Anda gunakan adalah fitur ES6 yang disebut ekspresi panah . Ekspresi minat lainnya

() => {};  // es6

akan diubah menjadi:

(function () {});

Karena ekspresi fungsi panah selalu anonim , masuk akal jika Anda menambahkan nama ke fungsi:

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

akan dikonversi menjadi

var empty = function empty() {}; 
prosti
sumber