Anonim JavaScript işlevi f => f tam olarak ne yapar?


101

İşlevleri bağımsız değişken olarak alan bir işleve sahip üçüncü taraf bir kitaplık kullanıyorum. Parametre olarak belirli bir işlevi ekleyip eklememeye karar vermek için bazı koşullu kontroller yapıyorum ve bazı durumlarda bir işlev sağlamak istemiyorum. Bu durumlarda null sağlanması bir hata verir.

Çalışan bu kodu buldum, ancak neler olduğunu tam olarak anlamıyorum.

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

f => fdenk () => {}boş anonim fonksiyonu?


3
Bu bir amacı değişmez bir döner fgöre MDN
Eli Sadoff

4
boş anonim değil, kimliktir.
Davin Tryon

17
FWIW, ECMAscript'in eski sürümlerindeki eşdeğerlerinin ne olduğunu görmek için genellikle bunun gibi yapıları babel'e yapıştırabilirsiniz .
James Thorpe


Stackoverflow.com/questions/24900875/… adresine verilen bu yanıt, bu soruyu doğrudan yanıtlamaz. F => f'nin anonim bir işlev olduğunu biliyordum, sadece ne yaptığını tam olarak anlamadım. Bu sorunun özel bir durum olduğunu düşünüyorum ve Felix King'in kimlik işlevleri hakkında verdiği bilgiler bu soruya özgü.
SomethingOn

Yanıtlar:


114

f => f benzer function(f){ return f; }

Çok yakın, ama beklediğiniz gibi değil.

* - yorumlarda da belirtildiği gibi, ince farklılıklar var, ancak sorunuz uğruna, bunların özellikle alakalı olduğunu düşünmüyorum . Diğer durumlarda çok önemlidirler.


2
Ben arasında en az iki farklılıkların aklınıza gelebilecek f => fve function(f) { return f; }:)
Benjamin Gruenbaum

6
@BenjaminGruenbaum harika, devam edin - alakalı olduğunu düşünüyorsanız bu yanıtı güncelleyin.
Jamiec

4
Bunun çok alakalı olduğunu sanmıyorum, sadece bir bilgiç: new (f => f)fırlatır, farklı bir toStringşeye sahiptir ve bazı nedenlerden ötürü (f => f).argumentsChrome'da atmalar yapamıyorum ama FF veya Edge'de değil.
Benjamin Gruenbaum

5
@BenjaminGruenbaum'un kullanımı thisda farklı. ( thisişlev gövdesinde görünmüyorsa fark gözlemlenemeyebilir ... Emin değilim)
Gregory Nisbet

184

f => fbir kimlik işlevi . Basitçe içeri aktarılan argümanı döndürür.

Bu işlev, herhangi bir dönüştürme gerçekleştirmediği için genellikle dönüştürme işlemleri için varsayılan değerler olarak kullanılır.

f => fdenk () => {}boş anonim fonksiyonu?

Hayır. Boş işlev hiçbir şey döndürmez. Kimlik işlevi, bağımsız değişkeni döndürür.


43
Ad, açıklama ve kullanım senaryosu sağlamak ve asıl soruyu cevaplamak için A +.
teşekkür ederim


9

Başkaları zaten ne f => folduğundan bahsetti , bu yüzden bunun derinliklerine inmeyeceğim. Ben sadece fonksiyonun geri kalanını açıklayacağım, çünkü f => fve arasında biraz fark var__DEV__ ? devTools() : f => f

Üçlü operatör __DEV__doğru bir değer olup olmadığını kontrol eder ve eğer öyleyse, işlevi döndürür devTools(). aksi takdirde, f => fhiçbir şey yapmayan kimlik işlevini döndürür . Başka bir deyişle: bu kod bazı geliştirme modu işlevlerini etkinleştirir. Kalan kod olmadan, bu modun ne eklediğini söylemek zor, ancak tahminen bazı ekstra kayıt bilgilerini ve daha az karmaşıklığı etkinleştirecek.


__DEV__ ? devTools() : f => fhiçbir şey atamıyor f. Kod örneğinden bir şey mi çıkardınız?
Felix Kling

2
İşlevi geri döndürmeyecek, işlevin sonucunu döndürecektir
Stephan Bijzitter

1
Avatarınız beni kızdırıyor ve günümü rahatsız ediyor. 90'lar gibi hissediyorum ve modemim bağlantıyı kaybetti. Yine de + 1, iyi bir yanıt için.
Konrad Viltersten

@KonradViltersten Avatarıma ilk yorum yapan siz değilsiniz. Yine de hoşlanmayan ilk kişi sensin. Çoğu insan nostaljik faktörü ve bunun neden olduğu beklentilerin küçük bir altüst oluşunu takdir etti.
Nzall

1
Umarım ironiyi anlamışsındır, dostum. Elbette şaka olarak düşünüldü. Açıkçası, hoşuma gitti ve onu canlandırıcı bir şekilde orijinal buluyorum.
Konrad Viltersten

9

Benzer ikilemle her zaman, cevabı almak için Babel'i kullanabilirsiniz .

Şöyle döndü:

"use strict";

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

BTW, => kullandığınız ok ifadesi adı verilen ES6 özelliğidir . Diğer ilgi ifadesi

() => {};  // es6

şuna dönüşür:

(function () {});

Ok işlevi ifadeleri her zaman anonim olduğundan, adı işleve eklerseniz anlamlıdır:

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

dönüşecek

var empty = function empty() {}; 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.