użycie this we funkcji

0

używać this we funkcjach nie można, ja wymyśliłem taki sposób, aby przed funkcją utworzyć zmienną globalną i do niej przypisać this czyli v=this; mam pytanie czy jest jakiś optymalniejszy sposób?

0

Nie możesz $this używać, jeśli funkcja nie należy do żadnej klasy :O

class CosDziwnego {
protected function aaa() {
   echo('lol!');
}

public function bbb() {
   $this->aaa();
}
}

$klasa = new CosDziwnego();
$klasa->bbb();

Wynik:
lol!

PS. I nie "we funkcji", tylko "w funkcji"!

0

Sorry, zapomniałem napisać, że to się tyczy Java script'u :P

Mam klasę do obsługi ajax'a przypisuje XMLHttpRequest() do this.request, ale nie mogę tego użyć onreadystatechange bo to inny obiekt :P

        this.request = new XMLHttpRequest();
	this.onSuccess = obj.onSuccess;
	ajax = this;
	this.request.onreadystatechange = function ()
	{
		if(ajax.request.readyState == 4)
		{
			ajax.onSuccess(ajax.request.responseText);
  	}
	}

Było w webmasterce ale madmike przeniósł do php -_-

0
konrados napisał(a)

używać this we funkcjach nie można,

Nieprawda. Można. JS udostępnia spore możliwości używania i manipulowania this wewnątrz funkcji.

Napisz precyzyjnie co chcesz osiągnąć. Oprócz opisu dorzuć przykład. W komentarzu napisz, gdzie i na co ma this wskazywać.

0

w wyższym poście opisałem :P, i wiem o tym, że można, lecz źle się wyraziłem :P powinienem napisać we funkcjach innego obiektu :D

Jeszcze dopisze, że klasa zrobiona za pomocą przestrzeni nazw

0

@konrados:
Opisałeś po kolejnych edycjach. Ale zrobiłeś to niegramatycznie -- co to znaczy "Mam klasę do obsługi ajax'a przypisuje XMLHttpRequest() do this.request"? Nie rozumiem o co Ci chodzi. Na serio, nie zgrywam się. Potem też zjadłeś jakieś słowo... Napisz posta porządnie. Podejrzewam, że mógłbym Ci bez żadnych problemów pomóc jeśli rozumiałbym w czym rzecz.

0

Wiesz co to klasa ? Wiesz na czym polega obsługa ajaxa? To co mam ci opisać ?

Ps: sorry, spieszyłem się bo musiałem wyjść na chwilę i nie zauważyłem że nie wszystko w jednym poście dałem.

Więc chodzi o to że mam klasę do obsługi ajaxa i chce w funkcji onreadystatechange zrobić sprawdzenie czy ready == 4 no obiekt xmlhttprequest jest przypisany do zmiennej request ale tą zmienna jest polem klasy ajax. I teraz żeby to przekazać muszę zrobić globalna ajax = this; i w onreadystatechange robić ajax.request.ready i się pytam czy da się to zrobić optymalniej

0

Ja wiem -- jestem st. specjalistą ds. rozwoju aplikacji i specjalizuję się w JavaScripcie właśnie, więc wręcz muszę wiedzieć ;)

Być może jednak Ty sam nie wiesz jak do końca z tym jest.

W wersji JavaScriptu, którą zapewne stosujesz, tak naprawdę nie ma klasycznego dziedziczenia. Nie ma prawdziwych "klas". Są obiekty: obiekty mogą dziedziczyć po innych obiektach, ale niezupełnie po "klasach". W JavaScripcie istnieje dziedziczenie prototypowe oraz coś, co nazywamy czasem dziedziczeniem funkcyjnym, co jest dość szerokim pojęciem obejmującym m.in. tzw. dziedziczenie pasożytnicze.

To jednak tutaj prawdopodobnie nie ma żadnego znaczenia. Nie potrzeba klas, by w JavaScripcie używać i ustawiać this -- wystarczą funkcje. Prosiłem Cię, żebyś napisał, w którym miejscu chciałbyś, żeby this na coś wskazywało i na co ma ono wskazywać (na jaki obiekt). Nigdzie tego nie napisałeś.

edit: teraz edytowałeś posta, ale ja muszę iść od kompa, więc nie zdążę nawet tej edycji przeczytać :P.

1

Myślę że funkcja bind zaspokoi twoje potrzeby:

 
        this.request = new XMLHttpRequest();
        this.onSuccess = obj.onSuccess;
        this.request.onreadystatechange = function ()
        {
                if(this.request.readyState == 4)
                {
                        this.onSuccess(this.request.responseText);
          }
        }.bind(this);

Z tym że nie zawsze jest dostępna także najlepiej jak napiszesz jeszcze cos takiego:

 
if (!('bind' in Function.prototype)) Function.prototype.bind = function(obj) {itd ... }
1

O ile zrozumiałem, to robisz to dobrze. Tyle tylko, że zmienną ajax musisz zadeklarowąć za pomocą instrukcji var, czyli zmienić linijkę:

ajax = this;

na:

var ajax = this;

To jest mega, mega ważne. Jeśli pominiesz var, to zamiast zmiennej lokalnej będziesz miał zmienną globalną -- w dodatku jedną dla wszystkich obiektów Twojej "klasy" Ajax. Jak dodasz var, to każdy obiekt klasy Ajax będzie miał swoją kopię zmiennej ajax i będzie to działało.

Możesz też wykonać sztuczkę z funkcją bind, może nawet byłoby to troszkę lepsze rozwiązanie, ale bind rzeczywiście nie jest dostępna we wszystkich przeglądarkach -- to funkcja z ECMAScriptu 5. Nad rozszerzaniem obiektów wbudowanych, tak jak to proponuje @RFabianski, trzeba się jednak 8x zastanowić. Choć IMO w przypadku funkcji bind można to od biedy zrobić warunkowo.

Przykładowa implementacja bind jest dostępna na MDC:
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

Osobiście najczęściej używam sposobu podobnego do tego, który Ty zastosowałeś, pamiętając o var. Istnieje dość popularna konwencja, żeby taką zmienną przechowującą this nazwać that, choć osobiście się jej nie trzymam -- "zmiennym prywatnym" w "klasach" nadaję nazwy rozpoczynające się od znaku podkreślenia (np. _foo), więc this przechowuję po prostu w zmiennej _this.

1 użytkowników online, w tym zalogowanych: 0, gości: 1