Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]przestrzeń nazw jak ją ugryźć ?
Forum PHP.pl > Forum > Przedszkole
marcus753
Witajcie,
próbuję opanować przestrzeń nazw w javascripcie i mam z nią mały problem a mianowicie:

  1. var testowaStrona = {
  2. obiekt1: {
  3. funkcja1 : function () {
  4. alert("funkcja11");
  5. var myVar = setInterval(function(){this.funkcja2("blabla")},1000);
  6. },
  7. funkcja2 : function (tekst) {
  8. alert("funkcja12"+tekst);
  9. }
  10. },
  11. obiekt2: {
  12. funkcja1 : function (imie,nazwisko,adres) {
  13. this.imie=imie;
  14. this.nazwisko=nazwisko;
  15. var adres=adres;
  16. },
  17. funkcja2 : function () {
  18. alert(this.funkcja1.imie);
  19. alert(this.funkcja1.adres);
  20. }
  21. },
  22. }
  23. testowaStrona.obiekt1.funkcja1();
  24. testowaStrona.obiekt2.funkcja1("marcin","marcinowski","wawa");
  25. testowaStrona.obiekt2.funkcja2();


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.
gr56
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
PrinceOfPersia
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 wink.gif

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);
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.