W poprzedniej części kursu opisałem podstawowe funkcje rdzenia MooTools 1.2, pora rozwinąć ten temat i omówić pozostałe części najważniejszego fragmentu tego frameworka.

Przyjrzymy się teraz bliżej funkcjom związanym z ... funkcjami :) Chodzi mi tu o : $empty, $arguments, $lamba i $try.

Puste funkcje też są przydatne

Jeżeli zdarzyło się Wam przeglądać kody źródłowe jakichś skryptów to czasami spotkać można było w nich zapis:

function(){}

przypisany do jakiejś właściwości obiektu (najczęściej). Otóż gdy będziemy pisać w MooTools, często okaże się, że potrzebujemy do jakiejś opcji/właściwości przypisać pustą funkcję. W MooTools to zadanie jest ułatwione gdyż zamiast stosować wcześniej wspomniany zapis, wystarczy zapisać:

wlasciwosc: $empty

co jest równoznaczne zapisowi:

wlasciwosc: function(){}

Cel istnienia funkcji $empty ? Nie ma się co doszukiwać tutaj głębszego sensu - funkcja ta ma nam po prostu zwiększyć czytelność kodu i skrócić zapis, nic więcej (zresztą czego można spodziewać się po pustej funkcji :P).

Poproszę n-ty argument !

Jeżeli ktoś miałby potrzebę stworzenia funkcji zwracającej n-ty argument, to może powiedzieć, że o niego zadbano - funkcja $arguments pozwala stworzenie funkcji zwracającej podany argument.

Przykładowo gdybyśmy chcieli, żeby funkcja nTyArgument zwracała 5 argument:

var nTyArgument = $arguments(4);
nTyArgument(1,2,3,4,5,6);

Zostanie zwrócona wartość 5.

Podobnie jak poprzednio chodzi tu głównie o skrócenie zapisu dzięki gotowym szablonom funkcji.

Gdy potrzeba zwrócić argument

Ktoś by się zapytał jaki jest sens tworzenia funkcji typu:

var dziwnaFunkcja = function(i){
    return i;
}

Bo przecież równie dobrze można by wpisać w miejsce użycia danej funkcji zwykłą wartość. Czasami jednak zdarza się potrzeba by jakiś argument lub właściwość był/a funkcją (spotkacie się z tym przy zdarzeniach lub w momencie spolszczania interfejsu Google Maps API ;) - wtedy funkcje o prezentowanej wcześniej budowie są niezbędne. I znów MooTools dba o nasze klawiatury - byśmy nie pisali na nich zbyt wiele kodu - zapis:

$lambda(x);

jest równoważny zapisowi:

function(x){
    return x;
}

Jakby nie patrzeć jest on sporo krótszy.

Sprawdźmy czy to wypali

Pamiętacie funkcję $pick ? Pora na jej odpowiednika, który zamiast sprawdzać czy dana zmienna jest zdefiniowana, sprawdzi czy dana funkcja zadziała poprawnie. Jeżeli jakaś z podanych funkcji wykona się poprawnie zostanie zwrócona wartość przez nią zwracana, a w przeciwnym wypadku zostanie zwrócona wartość null. Weźmy pod uwagę następujący przykład:

$try(
    function(){
        return test1;
    },
    function(){
        return test2;
    },
    function(){
        return test3;
    }
);

Żadna z trzech funkcji nie zadziała poprawnie, ponieważ wszystkie trzy odwołują się do nieistniejących zmiennych. Ale gdybyśmy zastosowali następujący kod:

var test2 = 10;
 
$try(
    function(){
        return test1;
    },
    function(){
        return test2;
    },
    function(){
        return test3;
    }
);

To zwrócona zostanie wartość 10 z wywołania drugiej funkcji. Nie muszę chyba dodawać, że jeżeli uruchamiamy funkcję $try na wielu funkcjach to powinny one zwracać ten sam typ danych ? No chyba, że chcemy potem sprawdzać co w ogóle otrzymaliśmy po wywołaniu funkcji $try.

Bogatszy obiekt Array

Pamiętam jak swego czasu rwałem włosy z głowy pisząc swój pierwszy UserJS dla Opery. Za każdym razem dostawałem w konsoli błędów mnóstwo linijek błędów, ale nie wiedziałem skąd. I wtedy odkryłem, że zbyt zawierzyłem developerom Opery - otóż Opera nie obsługuje metody forEach obiektu Array natywnie. Dlatego też w MooTools metoda ta jest dodawana do obiektu Array już na początku, a dodatkowo ma utworzony alias each - by jak się pewnie domyślacie skrócić jeszcze ten dość często używany zapis (często się tej metody używa - przynajmniej ja tak mam :P).

Mniej zorientowanym w temacie metody Array.forEach przypominam jej składnię:

tablica.forEach(function(element, indeks){
    // kod wykonywany dla każdego elementu tablicy
});

oczywiście równoważny zapis to:

tablica.each(function(element, indeks){
    // kod wykonywany dla każdego elementu tablicy
});

Obiekty iterowalne

Są takie zmienne w JavaScript, które nie są tablicami, ale z użyciem funkcji $A czy $each mogą nabrać zachowań tablicy - chodzi tu głównie o kolekcje elementów drzewa dokumentu.

Zatem zapis:

$A(zmienna);

Zamienia zmienną na tablicę na której można dalej operować metodami obiektu Array, natomiast funkcja $each:

$each(zmienna, function(){/* operacje */});

Spowoduje wykonanie na każdej składowej zmiennej danej funkcji - zmienna to obiekt typu Hash, Array lub tablica arguments.

Jak zwykle rozchodzi się głównie o zwięzłość zapisu - jak zresztą w większości wypadków prezentowanych w tej części kursu.

Podsumowanie

W tej części kursu MooTools 1.2 zapoznaliśmy się z funkcjami, które są gotowymi rozwiązaniami często stosowanych zapisów oraz poznaliśmy nowe możliwości obiektu Array jakie implementuje MooTools 1.2 . W kolejnej części kursu skupimy się na obiektach, a zwłaszcza na obiekcie Hash.

Komentarze do wpisu "MooTools 1.2 - podstawy podstaw cz.3":

Jeszcze nie ma żadnych komentarzy. Twój może być pierwszy.

Dodaj komentarz:

Textile Lite włączony ( szczegółowy opis znaczników ):
*strong* | # lista numerowana | * lista wypunktowana | _em_ | __italic__ | "link":http:// | bq. cytat.