Blog webdeveloperski Patryk yarpo Jar

Nietypowe działanie returna w JS

Autor wiadomości Styczeń 11, 2011

JavaScript jako jeden z najbardziej niezrozumianych języków świata posiada parę właściwości, których ja zrozumieć nie umiem. Nie, abym nie chciał.

Jedną z nich jest fakt, że nie nakazuje wstawiania średników po każdej instrukcji. Jeśli jednak nie wstawisz średnika, może cię srogo ukarać... (trochę mi to przypomina adminów sieci osiedlowej w moim akademiku :P).

Prosty przykład. Co zwróci funkcja?

function simple_example()
{
    return
    { 'value' : 'sialala' }
}


Owa funkcja zwróci.... 'undefined'. Dlaczego - wszystko przez to, że JS "wstawi" po `return' średnik. Dlatego jeśli chcesz zwrócić literał obiektu w funkcji, to zawsze zaczynaj go w tej samej linii, w której jest `return'.

A teraz trochę z innej beczki. Skoro tam wstawił średnik, to co tu zrobi:

for(var i = 0; i<10; i++)
{
    alert('sialala');
}

W językach C-powatych kod w stylu:

for(int i=0; i<n; i++);
{
    printf("sialala");
}

Spowodowałby, że pętla i owszem wykonałaby się 10 razy, ale "sialala" byłoby wyświetlone jeden raz (wykonanie pętli kończyłoby się na ; i wracało do warunku stopu). Klamry za średnikiem stworzyłyby nowy zasięg zmiennych (co w JS także działa co najmniej ciekawie - w porównaniu z językami C-powatymi)...

Skoro więc przy returnie wstawił się średnik, to czy tu się także wstawi? Nie. Czemu tu nie wstawił średnika? Nie wiem. Jeśli ktoś wie, z chęcią posłucham. Pewnie można coś znaleźć o tym w specyfikacji ECMAScript.

Komentarze (2) Trackbacks (0)
  1. Z tego względu po return może być wstawiony średnik iż jest to sama w sobie poprawna instrukcja. for () nie jest – potrzebuje ciała. Bądź druga opcja, bo zasady ASI (automatic semicolon insertion) są idiotyczne i nie chce mi się ich spamiętywać, że for() jest wyjątkiem jakiegoś typu. Więcej można znaleźć tutaj http://inimino.org/~inimino/blog/javascript_semicolons

    Generalnie – kto nie wstawia średników ten trąba. W dodatku klamra otwierająca powinna być w tej samej linii co konstrukcja poprzedzająca return/for/if/while/itd. Taki język.

    BTW wpadłem ostatnio na stronę akcji o nie używaniu średników (nauczcie się ASI, zaoszczędzicie na znaczkach w kodzie) i uważam, że jest idiotyczna. Widziałem takie efekty nie wstawiania średników, że nigdy bym się nie domyślił jak kod działa (nawet znając zasady) i zamiast robić jakieś hacki (które ci ludzie polecają), żeby np. umieszczać średnik na początku każdej linii rozpoczynającej się nawiasem (jeśli dobrze pamiętam), to można po ludzku umieszczać średniki zawsze na końcu instrukcji i nawias otwierający w tej samej linii i mieć to z głowy.

  2. Ogólnie nie pamiętam, aby zdarzył mi się problem opisany wyżej. Pisałem raczej ku przestrodze.

    Jeśli chodzi o klamry… To jest święta wojna, jak wcięcia, konwencje nazewnicze itp. 🙂

    Ja jestem za tym, aby stawiać klamrę o linię niżej. Dlaczego? Mniej kodu widać na ekranie. Mniej kodu widać na ekranie, a więc trzeba programować tak, aby był zrozumiały. Szybciej metoda wydaje się zbyt długa -> refaktoryzacja. Dodatkowo takie zwykłe przyzwyczajenie.

    Można połączyć obie metody nie będzie problemu:

    function a()
    {
    return _ =
    {
    ‘wynik’ : ‘dziala!’ // z przymrużeniem oka 😉
    };
    }

    niestety wymaga to, aby `_` został zarezerwowany jako swoisty EAX 🙂


Leave a comment

 

Brak trackbacków.