Przekazywanie funkcjom typów prostych i referencyjnych

JavaScript przekazywanie wartości funkcjom
We wcześniejszym poście opisałem jak działa mechanizm zmiennych typu prostego i referencyjnego. Podkreśliłem na co należy uważać i czego trzeba unikać. W kolejnym poście opisałem jak radzić sobie z kopiowaniem tablic jeśli potrzebujemy tak zwanej „głębokiej kopii”.

Dziś napiszę o kolejnym ważnym aspekcie języka JavaScript, mającym związek z typami zmiennych. Jest to kolejna rzecz spędzająca sen z powiek początkującym programistom tego języka. Chodzi o przekazywanie typów referencyjnych i prosty jako argumenty funkcji.

JavaScript przekazywanie wartości funkcjom

Przekazywanie funkcji zmiennej jako argument powoduje, że funkcja tworzy kopie tej zmiennej. W przypadku gdy jest to zmienna typu prostego, kopiuje się wartość tej zmiennej. W przypadku zmiennej referencyjnej, kopiuje się referencja do wartości. To już wiemy, ale dla pełnej jasności spójrzmy na te dwa przykłady

Wszystko działa dokładnie tak jak się tego spodziewaliśmy. Zmiany na argumencie typu prostego, nie mają żadnego wpływu na oryginał. natomiast, zmiany na tablicy (typ referencyjny) są widoczne jeśli wywołamy jej wartość wcześniej stworzoną zmienną.

Ok, zobaczmy jak w tym wypadku zachowają się obiekty.

Obiekt, to zmienna typu referencyjnego. Czyli tak jak zgadywaliśmy, przekazywanie go jako argumentu do funkcji, w której zmieniane są jego pola, zmieniają je również po za obszarem funkcji. Jeżeli tak nie zgadywałeś/aś to znaczy, że się nie przykładasz 🙂

Kolejny przykład

Co ten JavaScript znów…

Przekazaliśmy obiekt jako argument, został zmieniony, a jak go wywołujemy, to zmian nie widać. Co się dzieje? Dlaczego czasem gdy przekazujemy obiekty to się zmieniają a czasem nie?

Odpowiedz może dla niektórych oczywista, ale ja miałem długo problem ze zrozumieniem co tu się wyczynia 🙂

Problemem tutaj jest słówko „this”, które wskazuje na aktualny kontekst wywołania. W przykładzie kontekstem nie jest obiekt a funkcja! Zmienione zostało pole „name” funkcji a nie obiektu. Niestety JavaScript nie poinformuje nas żadnym błędem. Jeżeli chcemy wykorzystać referencyjność obiektu musimy pamiętać o tym zjawisku.

No dobra, ale jak to obejść?

są na to sposoby. Jednym z nich jest użycie metody, przypisanej do każdej funkcji w JavaScripcie „call()”. W tej metodzie podajemy jako argument kontekst wywołania funkcji, przez co „this” wskazuje nam na dokładnie to co chcemy. Przykład:

Sukces!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *