środa, 6 lutego 2013

funkcje w JavaScript, part 5 - funkcje moga zwracac funkcje

Funkcje zawsze zwracaja jakas wartosc, nawet jesli jawnie nie jest zdefiniowane return (wtedy zwracaja undefined). Funkcja moze zwrocic tylko jedna wartosc, na przyklad tablice obiektow lub... inna funkcje:

function a() {
  console.log('A!');
  return function(){
    console.log('B!');
  };
}

a();

Jak widac, funkcja a() zwraca funkcje anonimowa. W momencie, gdy wywolamy a() na konsoli wypisze sie A!, kazde kolejne wywolanie a() ponownie wypisze tylko A! na konsoli. To co jest w return nie jest wykonywane w trakcie wolania funkcji, to jest to, co funkcja zwraca. To jak sie dobrac do tego co zwraca return?

var b = a();

a();
b();

Rozwiazaniem jest przypisanie wyniku dzialania funkcji do zmiennej. W tej sytuacji wywolanie a() nadal bedzie wypisywac A!, natomiast b(), do ktorego zostala przypisana funkcja anonimowa, ktora zwraca funkcja a(), bedzie wypisywac B!.

W ten sam sposob mozna zrealizowac nadpisanie (czy przepisanie) sie funkcji. Wystarczy pod wynik dzialania funkcji a() podstawic zmienna... a:

var a = a();

a();
a();

Tylko za pierwszym razem, w momencie przypisania wykonuje sie cialo oryginalnej funkcji a() i na konsoli pojawia sie A!. Po przypisaniu, funkcja a() przy kazdym wywolaniu na konsoli pisze B!, poniewaz teraz jej cialem stala sie funkcja anonimowa zwracana przez oryginalna funkcje a().

No dobrze, wszystko pieknie, ale co jesli funkcja anonimowa zwracana przez oryginalna funkcje a() korzysta z zakresu zmiennych dostepnych w oryginalnej funkcji a()? Ot, na przyklad:

function a() {
  console.log('A!');
  var abc = "abc";
  return function(){
    console.log(abc);
  };
}

Otoz, wszystko bedzie dzialac. Dla funkcji anonimowej scope zostanie zachowany (jak i dlaczego, o tym za chwile, w innym poscie):

var a = a();

a();
a();

Przy pisaniu na konsoli zobaczymy A!, natomiast kazde kolejne wywolanie a() wypisze juz na konsoli abc.

Brak komentarzy:

Prześlij komentarz