Funkcje anominowe Drukuj
Ocena użytkowników: / 1
SłabyŚwietny 
Wpisany przez Patryk yarpo Jar   
poniedziałek, 01 lutego 2010 12:38

JS jako jeden z najbardziej ekspresyjnych języków posiada ciekawy i często wygodny mechamnizm funkcji anonimowych.

 

Polega to na tworzeniu funkcji, kótre nie mają nazwy i są jakby przypisane do konkretnego miejsca w kodzie.

 

Spójżmy na przykład (wykorzystanie zwykłych funkcji):

function example1() {
    alert("example 1");
}
 
function example2() {
    // tu cos robimy
    return example1();
}
 
example2();

 

Załóżmy teraz, że funkcja example1 jest wywoływana tylko w jednym miejscu, co więcej jej funkcjonalność jest ścisle związana z example2.

Możemy zatem zrobić coś takiego:

function example2() {
    // tu cos robimy
    return function() { //2
         alert("example 1"); // 3
    }
}
 
example2(); // 1

 

Cóż to spowoduje? Nic. Dlaczego?! (Nic, to nie jest najlepsze określenie. Coś się stanie, jednak nie zobaczysz niczego).

Przypatrzmy się, co tu się dzieje:

1. wywolujemy funkcję example2()

2. funkcja ta zwraca funckję. Nie wynik działania funkcji, a funkcję. Czyli, jak zrobimy tak:

function example2() {
    // tu cos robimy
    return function() { //2
         alert("example 1"); // 3
    }
}
 
var e = example2(); // 1
e();
e();

to uzyskamy dwukrotnie alert "example 1". Co zrobiliśmy? Przypisaliśmy do zmiennej e referencję na funkcję (teraz ta zmienna ma w sobie wartośąć adresu, gdzie ta funkcja się znajduje w pamięci. Jeśli wywolasz funkcję - przez dodanie `()' za nazwą zmiennej `e' - zostanie wywołana funkcja przypisana pod zmienną `e').

W poprzednim przypadku (tym z funkcją jawnie zdefiniowaną i nazwaną example1), moglibyśmy to otrzymać tak:

function example2() {
    // tu cos robimy
    return example1; // zwracamy referencję na tę funkcję, nie wynik jej działania
}

 

Innymi słowy operator `()' "auktywnia" funkcję.

Aby od razu działało jak przykład 1:

    function example2() {
            return (function() { // 1
                 alert("example 1");
            })(); // 2
        }
 
        example2();

1. całe ciało anonimowej funckji objęliśmy w nawiasy.

2. dodaliśmy za ciałem funkcji operator wywołania `()'.

 

Wynik powyższego kodu będzie identyczny do działania pierwszego listingu z tego artykułu.

To oczywiście nie wszystko na temat funkcji anonimowych. Ale o innych rzeczach (rekurencja, sprytne triki) napiszę kiedy indziej :)

 

Warto pobawić się samemu. Wujek google też z pewnością pomoże :)