Pytanie Czy "powrót" jest konieczny w ostatnim wierszu funkcji JS?


jaka jest najlepsza praktyka kończenia funkcji JS, jeśli nic nie zwraca?

function (a) {if (a) {setTimeout()} return;}

W tym przypadku "powrót" jest niepotrzebny, ale zostawiam go dla celów czytelności. Próbowałem również google, jeśli jest to sposób na mikro-optymalizację JS, ale nie był w stanie znaleźć niczego.


18
2017-10-19 19:33


pochodzenie


jeśli nic nie zwróci, to nie potrzebujesz zwrotu. nie powoduje niczego szybciej przez umieszczenie go tam. - Occam's Razor
Moim zdaniem usunięcie return czyni go bardziej czytelnym, ponieważ w ogóle go nie potrzebujesz. - Keiwan
Jeśli uruchomiłeś ten kod przez minifier, to by to usunął return;. Dlatego nie jest to żadna optymalizacja. Jeśli musisz go zachować, pamiętaj o dołączeniu średnika końcowego z powodu automatycznych reguł wstawiania średnika. Widzieć dokumentacja po więcej informacji. - Heretic Monkey


Odpowiedzi:


jaka jest najlepsza praktyka wykańczania funkcji JS, jeśli tak nie jest   zwrócić coś?

Funkcja zwraca undefined domyślnie. Sposób użycia return jest zatem tylko niezbędny jeśli chcesz zastąpić domyślne zachowanie.


Dlaczego większość go opuszcza, kiedy może

Społeczność Javascript wydaje się nie lubić niepotrzebnego, gadatliwego kodu. Można nawet powiedzieć, że jest to sport, który sprawia, że ​​kod jest tak krótki i zwarty, jak to tylko możliwe.

Dlaczego nie może to być najlepsza praktyka dla wszystkich

Nawyk ciągłego używania zwrotu może służyć jako dobre przypomnienie funkcji zawsze zwraca coś i tym samym przypominamy, aby zastanowić się, czy domyślne zachowanie powinno być nadpisane.

Jednak doświadczony programista będzie miał takie uwarunkowania głęboko zinternalizowane i dlatego rzadko będą potrzebować takich przypomnień.

Wniosek

W miarę zdobywania doświadczenia sport mniej dokładnego kodu nasila się i w tym kontekście pisanie kodu potwierdzającego domyślne zachowanie jest absolutnie nieuniknione.

Tak więc na dłuższą metę powiedziałbym, że większość ludzi rezygnuje z tego i że jest to uzasadnione z powodu wysokiego stopnia internalizacji.


11
2017-10-19 20:42





Nie, a return oświadczenie nie jest konieczne na końcu funkcji void (przepraszam za warunki C tam). Jeśli jednak chcesz wcześnie wyjść z funkcji (powiedz jeśli nie został spełniony określony warunek), użyjesz a return oświadczenie, nawet jeśli nie zwracasz wartości.

Włączenie instrukcji return na końcu funkcji void dla czytelności powinno być w porządku. Szczerze mówiąc, nie sądzę, że robienie tego doda wiele do twojego śladu.

W mojej opiniinie powinieneś jednak umieszczać instrukcji return na końcu funkcji, która niczego nie zwraca.


7
2017-10-19 19:39





Dla zabawy i FYI napisałem mały skrypt testowy, aby go wypróbować.

Ku mojemu zaskoczeniu, ten, który otrzymał zwrot, zwrócił szybciej niż ten, który nie posiadał około 100 ms na kilkanaście uruchomień w Firefoksie (Gecko). Wynik ten był dość spójny zarówno na Macu, jak i Ubuntu.

Uruchomiłem go również w Chrome (WebKit), a wyniki były znacznie bardziej niejednoznaczne, nie było w zasadzie spójności.

To były moje wyniki i nie są w żaden sposób ostateczne. Zapraszam do wypróbowania tego dla siebie. Moim zdaniem twoje osobiste preferencje są ważniejsze niż 100 ms. Jeśli tak grasz, dodaj go.

function f1(){
    console.log("doing stuff 1");
}

function f2(){
    console.log("doing stuff 2");
    return;
}

var start = (new Date()).getTime();
var i = 1000; while(i--) f1();
var time1 = (new Date()).getTime() - start;

var start = (new Date()).getTime();
var i = 1000; while(i--) f2();
var time2 = (new Date()).getTime() - start;

console.log("Without return: "+time1);
console.log("With return: "+time2);

Oto skrzypce.


2
2017-10-19 19:48



Wyniki twojego JSFiddle wydają się zupełnie przypadkowe. Czasami funkcja bez instrukcji return działa szybciej (zależnie od czasu), a innym razem funkcja z instrukcja return działa szybciej. Nie sądzę, że ta informacja jest wystarczająco dokładna, aby sformułować solidny wniosek. - Brynden Bielefeld
zgadzam się Brynden. Testowanie porównawcze jest generalnie niewiarygodne w javascriptu, ponieważ jest tak wiele różnych interpretatorów i wersji. Jednak na mojej konfiguracji FF na Macu za każdym razem powracał pierwszy z powrotem. - Occam's Razor


Jak stwierdzili inni ludzie, nie jest to konieczne. Ale niektórzy ludzie uważają to za dobrą praktykę. szczególnie, gdy uwielbiasz być deklaratywny i wiesz, że oświadczenie powrotu jest niczym więcej niż faktycznym GOTO komunikat. (pomyśl o tym, że twoje programowanie jest całkowicie liniowe i możesz poruszać się tylko między kodem a etykietami i instrukcjami goto). W ten sposób zawsze deklarujesz, dokąd zmierzasz: wracasz.

Kolejny powód do zwrotu pustki

Na przykład możesz mieć następującą funkcję

function login(user, pass){
  if(user === null)
    return;
  doTheRest(user, pass);
}

W ten sposób w metodzie void możesz wrócić "wcześnie", aby upewnić się, że nie kontynuujesz, gdy warunek nie jest spełniony. To jest tak zwane programowanie obronne.

uwaga: przez większość czasu lepiej rzucić błąd throw new Error(...) zamiast. W ten sposób zdasz sobie sprawę, że wcześniej zapomniałeś dopasować warunek wstępny.


2
2017-10-19 19:51





Dodawanie niepotrzebnego return oświadczenie nie spowoduje żadnych rzeczywistych różnic w zakresie optymalizacji. Napisz kod dla ludzi, a nie komputerów.

Nie ma potrzeby, jeśli nie użyjesz funkcji, aby uzyskać wynik (np. sum(2, 3)), Jak na przykład:

function xxx(){
  post().then(function(){
    location.href('http://stackoverflow.com');
  }, function(){
    showError();
  });
}

Widzisz, mam 3 funkcje, a wszystkie nie return oświadczenie i jest w porządku.

Wchodząc w ziemie opinii, powiedziałbym, że ty mógłby zostaw to dla twojej czytelności i wygody, ale będziesz miał podejście inne niż większość programistów. A im mniej znaczy lepiej (KISS), a jeśli nie jest to wcale konieczne, lepiej to pominąć.

PS: Wynik funkcji bez return, będzie undefined, naturalnie.

 function a(param){
   var x = param;
 }
 function b(param){
   var x = param;
   return;
 }
 function c(param){
   var x = param;
   return x;
 }
 a(5); // undefined
 b(5); // undefined
 c(5); // 5

1
2017-10-19 19:52





Nie ma potrzeby używania return oświadczenie, ale jest to dobra praktyka void operator, który wymusza słowo kluczowe function, aby było traktowane jako wyrażenie zamiast deklaracji.

Ale wtedy twoja funkcja powinna wyglądać tak:

void function (a) {if (a) {setTimeout()}}

Jeśli zadeklarujesz wyrażenie funkcji, które nie zostało bezpośrednio wywołane, powinno:

  • return true 

lub

  • return !failure;

1
2017-10-19 19:45



nie określamy typów zwracanych funkcji w javaSCRIPT. - Occam's Razor
Według Odwołanie do JavaScript MDM  prawidłowe jest określenie typu zwrotu funkcji. - Łukasz D. Tulikowski
void jest operatorem js i nie ma nic wspólnego z funkcjami. w java na przykład void jest modyfikatorem funkcji, a nie tylko operatorem, który można umieścić tam, jeśli dev ma na to ochotę. nie to samo. - Occam's Razor
Nie jest tak naprawdę używany przed funkcją, częściej jest używany w linkach <a href="javascript:void(...);" - element11
Może być użyty do wymuszenia, aby słowo kluczowe function było traktowane jako wyrażenie zamiast deklaracji. Więc to jest operator. - Łukasz D. Tulikowski