![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 281 Pomógł: 3 Dołączył: 8.06.2009 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Witajcie,
próbuję opanować przestrzeń nazw w javascripcie i mam z nią mały problem a mianowicie:
Mamy sobie kod, na dole wywołuje funkcje obiektu1 funkcja1, wszystko jest ok do póki nie chce przypisać funkcji2 do set interval wywala error że nie ma takiej funkcji, co ciekawe jeśli w samej funkcji wstawie np. this.funkcja2() ładnie mi tą funkcje otworzy. Jak zatem utworzyć interval dla funkcji 2 ? wiem że można pisac pełen adres: testowaStrona.obiekt1.funkcja2(); ale to bez sensu, nie da się jakoś łatwiej ? I drugie pytanie: Mamy obiek 2 oraz dwie funkcje w pierwszej chciałbym przypisać kilka parametrów a w drugiej te parametry odczytać, jak mogę to zrobić ? na razie nie mam dostępu ani do imienia ani do adresu. Pozdrawiam i dziękuję za pomoc. Ten post edytował marcus753 15.04.2014, 19:51:27 -------------------- Cokolwiek zostanie upuszczone na uklad elektroniczny, spadnie zawsze tam gdzie wyrzadzi najwiecej szkody.
|
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 77 Pomógł: 15 Dołączył: 19.11.2011 Ostrzeżenie: (0%) ![]() ![]() |
1. W kontekście funkcji, this nie odnosi się już do obiektu tylko do samej funkcji. Można zachować odniesienie do obiektu przypisując wartość this do innej zmiennej np
Kod var that = this; Natomiast jeśli nie chcesz przekazywać żadnych parametrów do wywoływanej funkcji to możesz zrobić po prostu tak: Kod setInterval(this.funkcja2, 1000); 2. W tym wypadku this odnosi sie do obiekt2 tak wiec mozesz odczytac zmienne uzywajac this.imie, this.nazwisko |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 717 Pomógł: 120 Dołączył: 18.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
Kod funkcja1 : function () { alert("funkcja11"); var myVar = setInterval(function(){this.funkcja2("blabla")},1000); }, o ile w większości języków this oznacza instancję klasy, to w JavaScripcie zmienna "this" jest dynamiczna i ustalana przy każdym wywołaniu funkcji. (np. przy różnego rodzaju zdarzeniach myszy zazwyczaj zmienna this wskazuje na obiekt (np. dany <div>) ,w którym zostało wywołane zdarzenie) I ponieważ tworzysz funkcję anonimową Kod function(){this.funkcja2("blabla")} to jeśli ta funkcja zostanie odpalona, to w środku tej funkcji this będzie już czym innym, niż na zewnątrz funkcji. (Nie pamiętam już czy będzie null, czy obiektem window, czy jeszcze czym innym) Można to obejść "zapamiętując" zmienną this: Kod funkcja1 : function () { var self = this; alert("funkcja11"); var myVar = setInterval(function(){self.funkcja2("blabla")},1000); }, Natomiast oczywiście jeśli masz zmienną obiektu i wywołujesz ją po kropce, czyli np. testowaStrona.obiekt2.funkcja2();, to z automatu zmienna this wskazuje na obiekt2. Dlatego można pomyśleć na początku, że JS to normalny język ![]() Problem w tym, że to działa tylko jak od razu wywołujesz funkcję. Jeśli zrobiłbyś tak setInterval(testowaStrona.obiekt2.funkcja2, 1000); to nie zadziała, ponieważ wtedy podajesz jako argument samą funkcję, setInterval widzi tylko obiekt funkcji (funkcja jest obiektem), a nie widzi, do którego obiektu funkcja należy (czyli co "pierwotnie" było this). Na dodatek można manipulować zmienną this przy wywoływaniu funkcji, służą do tego metody call i apply. Tak możesz wywołać metodę obiektu2, ale podmienić jej zmienną this, żeby this == obiekt1 Kod testowaStrona.obiekt2.funkcja2.call(obiekt1); Oraz za pomocą metody bind można "wiązać" funkcję do konkretnego obiektu, np: Kod var kot = { jak_robi: 'miau, miau', funkcja: function() { alert(this.jak_robi); } }; setTimeout(kot.funkcja.bind(kot), 700); tym sposobem "przywiążesz" funkcję do konkretnego obiektu kot. można nawet wiązać parametry, dzięki czemu można robić skróty: Kod setTimeout(alert.bind(null, 'hello world'), 1000); zamiast pisać tak: Kod setTimeout(function() {
alert('hello world'); }, 1000); Ten post edytował PrinceOfPersia 15.04.2014, 22:54:49 -------------------- |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 02:03 |