Jackson częściowo odpowiedział na to pytanie w podobnym pytaniu:
Niejawny zwrot, ale tylko wtedy, gdy nie ma bloku.
- Spowoduje to błędy, gdy jednowierszowy rozwinie się do wielu wierszy, a programista zapomni dodać
return
.
- Niejawny zwrot jest niejednoznaczny składniowo.
(name) => {id: name}
zwraca obiekt {id: name}
... prawda? Źle. Wraca undefined
. Te nawiasy klamrowe są jawnym blokiem. id:
to etykieta.
Dodałbym do tego definicję bloku :
Instrukcja blokowa (lub instrukcja złożona w innych językach) służy do grupowania zera lub większej liczby instrukcji. Blok jest ograniczony parą nawiasów klamrowych.
Przykłady :
// 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')
name
z funkcją zawartą w nawiasach i wywoływaną z jednym argumentem „Jess”. Kod między=>
iw)('Jess')
każdym przypadku jest treścią funkcji strzałki. Potraktuj to jak krótką formę natychmiastowo wywołanego wyrażenia funkcyjnego formularza(function (name) { return { id: name } })('Jess')
{}
) czy bloku , zakłada, że a{ }
oznacza blok. Oznacza to, że gdy widziid: name
, że myśli,id:
jest wyrazem tworząc etykietę (bardzo rzadko używanych funkcji JS, który zajmuje się kontrolą przepływu i używa:
), a następniename
poniżejid:
jest po prostu oddzielne oświadczenie, że zawiera tylko zmiennąname
(& nic nie robi).Rozumiem tę praktyczną zasadę ...
Kandydaci to:
W przypadku innych operacji (więcej niż jednoliniowe, które wymagają bloku, zwrot musi być jawny
źródło
Tutaj jest inny przypadek.
Pisząc komponent funkcjonalny w Reakcie, możesz użyć nawiasów do zawijania niejawnie zwróconego JSX.
źródło
Oto kolejny przypadek, który przysporzył mi kłopotów.
Tutaj definiujemy funkcję zwracającą anonimową funkcję. „Podstępny” bit polega na tym, że ciało funkcji zewnętrznej funkcji (część rozpoczynająca się od (bar) => ...) wygląda wizualnie jak „blok”, ale tak nie jest. Ponieważ tak nie jest, włącza się niejawny zwrot.
Oto, jak by wykonać zawijanie:
Sposób, w jaki to rozpakowałem, aby upewnić się, że zrozumiałem, polegał na „usunięciu potwierdzenia” funkcji.
Oto semantyczny odpowiednik pierwszego bloku kodu, po prostu powodujący, że treść funkcji wrap () wykonuje jawny zwrot. Ta definicja daje takie same wyniki jak powyżej. Tutaj łączą się kropki. Porównaj pierwszy blok kodu powyżej z blokiem poniżej i jasne jest, że sama funkcja strzałki jest traktowana jako wyrażenie, a nie blok, i ma implikowany zwrot .
W pełni niezarrowified wersja wrap byłaby taka, która choć nie jest tak zwarta jak wersja z grubą strzałką w górę, wydaje się dużo łatwiejsza do zrozumienia.
W końcu, dla innych, którzy być może będą musieli przeczytać mój kod, i dla mnie w przyszłości, myślę, że wolałbym wybrać wersję bez strzałki, którą można zrozumieć wizualnie na pierwszy rzut oka, niż wersję ze strzałką, która zajmuje sporo czasu pomyślał (aw moim przypadku eksperymentował), aby narobić.
źródło
Funkcje strzałkowe pozwalają na niejawny zwrot: wartości są zwracane bez konieczności używania
return
słowa kluczowego.Działa, gdy w treści funkcji znajduje się instrukcja on-line:
Inny przykład, zwracanie obiektu (pamiętaj, aby zawijać nawiasy klamrowe w nawiasy, aby uniknąć uznania go za nawiasy funkcji zawijania):
źródło