Es6 Ok İşlevlerinde "return" i ne zaman kullanmalıyım?


Yanıtlar:


262

Jackson buna benzer bir soruda kısmen cevap verdi :

Örtük dönüş, ancak yalnızca blok yoksa.

  • Bu, bir astar birden çok satıra genişlediğinde ve programcı a eklemeyi unuttuğunda hatalara neden olur return.
  • Örtük geri dönüş sözdizimsel olarak belirsizdir. (name) => {id: name}nesneyi döndürür {id: name}... değil mi? Yanlış. Geri döner undefined. Bu diş telleri açık bir bloktur. id:bir etikettir.

Ben buna bir blok tanımını eklerdim :

Sıfır veya daha fazla ifadeyi gruplandırmak için bir blok ifadesi (veya diğer dillerde bileşik ifadesi) kullanılır. Blok bir çift kıvırcık parantez ile sınırlandırılmıştır.

Örnekler :

// returns: undefined
// explanation: an empty block with an implicit return
((name) => {})() 

// returns: 'Hi Jess'
// explanation: no block means implicit return
((name) => 'Hi ' + name)('Jess')

// returns: undefined
// explanation: explicit return required inside block, but is missing.
((name) => {'Hi ' + name})('Jess')

// returns: 'Hi Jess'
// explanation: explicit return in block exists
((name) => {return 'Hi ' + name})('Jess') 

// returns: undefined
// explanation: a block containing a single label. No explicit return.
// more: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label
((name) => {id: name})('Jess') 

// returns: {id: 'Jess'}
// explanation: implicit return of expression ( ) which evaluates to an object
((name) => ({id: name}))('Jess') 

// returns: {id: 'Jess'}
// explanation: explicit return inside block returns object
((name) => {return {id: name}})('Jess') 

Ben bu sözdizimi alamadım .. bir sınıf littoral kullanarak bir sınıf oluşturmak ve sonra bir argüman ('Jess') ile zımni bir kurucu çağırıyor musunuz? Bunu yapacağınızı sanıyordum ((name) => ({id: 'Jess'}))
Michael Dausmann

3
@MichaelDausmann Bu namefonksiyon parantez içine alınmış ve bir argüman olan "Jess" ile çağrılmış bir parametreye sahip bir ok fonksiyonudur . =>Ve )('Jess')her durumda arasındaki kod , ok işlevinin gövdesidir. Hemen Çağrılan Fonksiyonun kısa bir formu gibi düşünün(function (name) { return { id: name } })('Jess')
Russ Cam

Çok yararlı indded! Promises.all uygulamasında bir ok işlevine sahip öğeler üzerinde harita sorunlarının tespit edilmesine yardımcı olur ve ok işlevli dizi üzerinden eşleme için değer döndürülmediyse tanımsız bir dizi alıp almadığınızı görebilirsiniz.
jay shah

Ok işlevleri için örtük dönüş sistematiği yapmanın olumsuz tarafı ne olurdu? Tıpkı coffeescript'in yaptığı gibi ... (coffeescript'i sevmiyorum)
Augustin

4
Açıkça anlaşılacağı üzere, JS ayrıştırıcı bir ifadeyi (nesne değişmezi içeren bir ifade gibi {}) veya bir bloğu bekleyip beklemediğini bilmediği için , bir bloğun bir blok olduğunu varsayar { }. Bu, gördüğü zaman id: name, id:bir etiket oluşturan bir ifade olduğunu (akış denetimi ile ilgilenen ve a kullanan JS'nin çok nadir kullanılan bir özelliği :) ve daha sonra nameaşağıdakilerin id:yalnızca değişkeni içeren ayrı bir ifade olduğunu düşünüyor name(& hiç birşey yapmıyor).
iono

18

Bu kural kuralını anlıyorum ...

Etkin bir şekilde dönüştürülen işlevler için (bağımsız değişkenlerin tek satırlık manipülasyonları), dönüş örtüktür.

Adaylar:

// square-root 
value => Math.sqrt(value)

// sum
(a,b) => a+b

Diğer işlemler için (blok gerektiren birden fazla gömlek, dönüşün açık olması gerekir


11

Burada başka bir dava var.

React'ta işlevsel bir bileşen yazarken, dolaylı olarak döndürülen JSX'i sarmak için parantez kullanabilirsiniz.

const FunctionalComponent = () => (
  <div>
    <OtherComponent />
  </div>
);

4
Her zaman parantez kullanabilirsiniz, JSX veya React ile ilgisi yoktur .
Emile Bergeron

4

İşte bana biraz sıkıntı veren başka bir dava.

// the "tricky" way
const wrap = (foo) => (bar) => {
  if (foo === 'foo') return foo + ' ' + bar;
  return 'nofoo ' + bar;
}

Burada anonim bir işlev döndüren bir işlev tanımlarız. "Zor" bit, dış işlevin işlev gövdesinin ((bar) => ... ile başlayan bölüm) görsel olarak bir "blok" gibi görünmesidir, ancak değildir. Öyle olmadığından, örtük dönüş devreye girer.

Sarmanın nasıl yürütüleceği aşağıda açıklanmıştır:

// use wrap() to create a function withfoo()
const withfoo = wrap('foo');
// returns: foo bar
console.log(withfoo('bar'));

// use wrap() to create a function withoutfoo()
const withoutfoo = wrap('bar');
// returns: nofoo bar
console.log(withoutfoo('bar'));

Bunu çözdüğümden emin olmak için işlevlerin “çözülmesi” olduğunu anladım.

İlk kod bloğunun semantik eşdeğeri, sadece wrap () gövdesini açık bir dönüş yapıyor. Bu tanım yukarıdakiyle aynı sonuçları verir. Noktalar bu noktada birleşir. Yukarıdaki ilk kod bloğunu aşağıdaki kod bloğuyla karşılaştırın ve bir ok fonksiyonunun kendisine bir blok olarak değil, bir ifade olarak ele alındığı ve ima edilen dönüşe sahip olduğu açıktır .

// the explicit return way
const wrap = (foo) => {
  return (bar) => {
    if (foo === 'foo') return foo + ' ' + bar;
    return 'nofoo ' + bar;
  }
}

Tamamen lisanssız sargının versiyonu, yağ oklu versiyon kadar kompakt olmasa da, anlaşılması çok daha kolay görünüyor.

// the "no arrow functions" way
const wrap = function(foo) {
  return function(bar) {
    if (foo === 'foo') return foo + ' ' + bar;
    return 'nofoo ' + bar;
  };
};

Sonunda, kodumu okumak zorunda kalabilecek başkaları ve gelecekteki ben için, ilk bakışta görsel olarak anlaşılabilen ok olmayan versiyona gitmeyi tercih ederim, adil bir parça alan ok yerine düşünce (ve benim durumumda deney) grok.


3

Ok işlevleri örtük bir dönüş elde etmenizi sağlar: değerler returnanahtar kelimeyi kullanmadan döndürülür .

İşlev gövdesinde çevrimiçi bir deyim olduğunda çalışır:

const myFunction = () => 'test'

console.log(myFunction()) //'test'

Başka bir örnek, bir nesneyi döndürme (sarma işlevi gövde parantezleri olarak kabul edilmesini önlemek için kıvırcık parantezleri parantez içine almayı unutmayın):

const myFunction = () => ({value: 'test'})

console.log(myFunction()) //{value: 'test'}


1
Bu, biraz daha açıklamaya ihtiyaç duysa da, doğru cevap olmalıdır. Temel olarak işlev gövdesi bir blok değil, bir ifade olduğunda, bu ifadenin değeri dolaylı olarak döndürülür. Yanlışsam düzelt.
Paul-Sebastian Manole
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.