Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> js, rekurencje, liczenie pomocy!
daniofantasy
post
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 1
Dołączył: 14.06.2007
Skąd: Chesterfield UK

Ostrzeżenie: (0%)
-----


Witam,

Mam takie cudo:


  1. var ImgFader = function(FadeDelay,TimeDelay,x,aImages1,aImages2,aImages3,DOMElement,FirstTimeStart) {
  2.  
  3. var FirstFader = $(DOMElement[0]);
  4. var SecondFader = $(DOMElement[1]);
  5. var ThirdFader = $(DOMElement[2]);
  6.  
  7. if (x==4) {
  8. x=1;
  9. }
  10.  
  11. var OldTimeDelay = TimeDelay;
  12.  
  13. if (FirstTimeStart) {
  14. TimeDelay = 0;
  15. }
  16.  
  17. setTimeout(function() {
  18. FirstFader.fadeOut(FadeDelay);
  19. SecondFader.fadeOut(FadeDelay);
  20. ThirdFader.fadeOut(FadeDelay);
  21. setTimeout(function() {
  22. FirstFader.css('background','url('+aImages1[x-2]+')');
  23. SecondFader.css('background','url('+aImages2[x-2]+')');
  24. ThirdFader.css('background','url('+aImages3[x-2]+')');
  25. }, FadeDelay);
  26.  
  27. FirstFader.fadeIn(FadeDelay);
  28. SecondFader.fadeIn(FadeDelay);
  29. ThirdFader.fadeIn(FadeDelay);
  30. x++;
  31. ImgFader(FadeDelay,OldTimeDelay,x,aImages1,aImages2,aImages3,DOMElement,false);
  32. }, TimeDelay);
  33. };
  34.  
  35. $(document).ready( function (){
  36. var images1 = new Array('images/Img1_1.jpg','images/Img2_1.jpg','images/Img3_1.jpg')
  37. var images2 = new Array('images/Img1_2.jpg','images/Img2_2.jpg','images/Img3_2.jpg')
  38. var images3 = new Array('images/Img1_3.jpg','images/Img2_3.jpg','images/Img3_3.jpg')
  39. var DOMElements = new Array('#Fader1','#Fader2','#Fader3');
  40. ImgFader(500,5000,1,images1,images2,images3,DOMElements,true);
  41. });


i teraz jak po kodzie :


if (x==4) {
x=1;
}

wrzuce alerta, to przy każdym jednorazowym wywołaniu funkcji zamiast mi ładnie wyświetlić, że x=1 albo x=2 albo x=3, czego bym się spodziewał, ten zakichany js wali mi alertami z każdym kolejnym argumentem funkcji z którym rekurencja była wcześniej wywołana,

przez to nie mogę po tym if-ie zrobić ślicznego:

if (x == 1) {
...moje instrukcje...
}
Od razu zaznaczam, że o js mam tylko blade pojęcie - i tak - zdaję sobie sprawę, że powyżej cytowany kod jest daleki od dobrego webowego rzemieślnictwa - prosiłbym tylko osoby znające się na tym o pomoc w zrozumieniu o co chodzi - dlaczego mój x w tej funkcji wygląda tak: 123123123123 zamiast 1 lub 2 lub 3

Bo podejrzewam, że to coś nie tak z inkrementacją - bo dlaczego x które jest równe 1, zwiększone o 1 daje w wyniku 12 zamiast 2... :/ ... ?

Proszę o pomoc - z góry dziękuję (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
zegarek84
post
Post #2





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


javascript jest jednym z fajniejszych jezyków gdy się zrozumie podstawy - czyli czysty js, jego obiektowość, dziedziczenie [akurat tu obiektowość nie jest potrzebna] a przede wszystkim zasięg zmiennych - bodajże po angielsku to są clousures [domknięcia czy jakoś tak - może pomyliłem teraz pojecia - nie wiem po co ta przedmowa ;p]

wszystkie zmienne deklarowane jako argument funkcji są zmiennymi prywatnymi lokalnymi/prywatnymi tej funkcji - więc tak jakbyś przed nimi dopisał także var - a więc w rekurencji zatracasz zasięg do zmiennej będącej na zewnątrz... i jeszcze jedna kwestia - nie wiem dokładnie jak to jest rozwiązane w jquery ale chyba a raczej na 99% podpiołeś wiele funkcji pod hover - za każdym razem przy rekurencji - a widzisz oczywiście raczej ostatni efekt choć zapewne każda z nich się wykona - calego kodu nie chce mi się analizować i skrót dlaczego masz wartość x===3 w pewnym zauważalnym dla Ciebie miejscu...

gdy zagłębiasz się poraz n-ty w funkcję w pewnym momencie jak sam chciałeś przyblokować masz wartość === 4 - idąc dalej od razu zamieniasz na 1 i dalej co będę pisał to ważne, cobyś poczytał o zasięgu zmiennych w javascript

Kod
        if (parseInt(x)==4) {
            var x=1;
        }

podpinasz dalej hover - gdzie ze względu na to jaki jest zasięg zmiennych w javascript zmienna x w funkcjach w hoverze jest przekazana w zasadzie przez referencję [nie dosłownie ale to najlepiej obrazuje tutaj zasięg - jeśli nie ma zmiennej lokalnej jest ona szukana poziom wyżej aż do obiektu window....]

niżej masz takie fragmenty jak:
x = x + 1; - gdzie x===2 - wchodząc do funkcji i robiąc obieg dla 2 hovera masz ustawionego na 3, jeśli x będzie 3 co przejdzie w ifie to hovera masz na 4, jeśli x masz na 1 to hovera masz na 2 - więc widzieć możesz hovera na 2 i na 3

zwróć uwagę ile aż razy Ci mrugnie ta chmurka u Ciebie ;]
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 26.09.2025 - 20:20