Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [JS] Włąsna funkcja reaz zwraca true a raz undifined
pehaperowiec
post 30.03.2013, 17:56:57
Post #1





Grupa: Zarejestrowani
Postów: 91
Pomógł: 8
Dołączył: 26.09.2011

Ostrzeżenie: (10%)
X----


Kod
function zagadka() {
    var dec=confirm("Czy 2+2=5?");
    if(dec===false) {
        var wynik=prompt("No to w takim razie podaj poprawny wynik");
        if(parseInt(wynik)===4) {
            alert("rewelacja!");
            return true;
        } else {
            alert("Szło Ci dobrze ale padłeś! Spróbuj jeszcze raz");
            zagadka();
        }
    } else {
        alert("No to słaby jesteś z matmy! Spróbuj jeszcze raz");    
        zagadka();
    }
}

document.write(zagadka());
Dlaczego raz zostaje wypisane undifined a raz true? Od czego to zależy?
Go to the top of the page
+Quote Post
Crozin
post 30.03.2013, 18:06:53
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Ponieważ Twoja funkcja zwraca albo TRUE albo nic nie zwraca (UNDEFINED). Zauważ, że w momencie, gdy na początku klikniesz iż 2+2=5, wyświetli się komunikat oraz ponownie wykona funkcja zagadka(). Jednak gdy drugie wywołanie tej funkcji zakończy się (ktoś podał, że jest to 4) sterowanie zostanie zwrócone do pierwszego wywołania tej funkcji i tak zakończy się nie zwracając niczego.
Rozwiązaniem będzie zwrócenie wartości rekurencyjnego wywołania zagadka(), tj. return zagadka(); zamiast samego zagadka();.

Jeżeli masz jakieś wątpliwości co do tego, co zwracane jest w poszczególnych momentach działania Twojego kodu, odpal go sobie w debuggerze i wykonaj krok po kroku.
Go to the top of the page
+Quote Post
PrinceOfPersia
post 30.03.2013, 23:28:37
Post #3





Grupa: Zarejestrowani
Postów: 717
Pomógł: 120
Dołączył: 18.04.2009

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


takie 2 uwagi "techniczne"
Cytat
document.write(zagadka());

1. Nie używaj do takich celów document.write, lepiej użyć funkcji alert albo console.log.
Document.write jak masz już załadowany dokument kasuje ci całą zawartość dokumentu i potem są problemy.

2.
Cytat
} else {
alert("No to słaby jesteś z matmy! Spróbuj jeszcze raz");
zagadka();
}


lepiej szanować call stack i usunąć rekurencję, przerobić na setInterval z argumentem 0:
Cytat
} else {
alert("No to słaby jesteś z matmy! Spróbuj jeszcze raz");
setInterval(zagadka, 0);
}




--------------------
Go to the top of the page
+Quote Post
pehaperowiec
post 31.03.2013, 08:51:44
Post #4





Grupa: Zarejestrowani
Postów: 91
Pomógł: 8
Dołączył: 26.09.2011

Ostrzeżenie: (10%)
X----


1) Jak debugować kod JS?
2) Dlaczego dokładniej return zagadka() ?
3) Dlaczego alert albo console.log jest lepsza?
Go to the top of the page
+Quote Post
viking
post 31.03.2013, 09:27:26
Post #5





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

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


https://getfirebug.com/javascript

Konsola umożliwia praktycznie uruchamianie kodu bezpośrednio. Czasami nie trzeba nawet tworzyć pliku js żeby coś na szybko sprawdzić (takie podłączenie do kompilatora JS w przeglądarce). Z drugiej strony już po wygenerowaniu DOM możesz dowolnie nim manipulować, sprawdzać węzły, podpięte zdarzenia - wszystko na żywo bez odświeżania jak musisz to robić z alertem albo document.write.


--------------------
Go to the top of the page
+Quote Post
Crozin
post 31.03.2013, 12:05:45
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


1. Każda przeglądarka posiada jakiegoś rodzaju narzędzia deweloperskie - niektóre przez dodatkową wtyczkę (Opera Dragonfly, Firefox Firebug). Osobiście najlepiej pracowało mi się zawsze z tymi z Chromea. Google jak zwykle służy pomocą: https://www.google.com/search?q=chrome+debu...me&ie=UTF-8
2. Ustaw sobie breakpointa na pierwszej linii swojej funkcji (wywołaniu window.confirm()), a następnie wykonuj swój kod krok po kroku. Najpierw podaj, że 2+2 równa się 5, następnie, gdy Twoja funkcja opierniczy Cię, żeś tuman z matematyki, podaj, że 2+2 nie równa się 5, a równa się 4. O ile drugie (wewnętrzne) wywołanie funkcji zwróci TRUE o tyle pierwsze (zewnętrzne/pierwotne) wywołanie funkcji nie zwraca już nic (UNDEFNIED).
3. Ponieważ console.log() umożliwia Ci wygodne wyświetlenie dowolnych danych (tablic, obiektów, funkcji jak i samym typów prostych). Jest to po prostu specjalne narzędzie do prostego debugowania swojego kodu.

@PrinceOfPersia: Korzystając z setTimeout/setInterval nadal zaśmiecasz callstacka, ponieważ wywołanie funkcji jest rekurencyjne. Musiałbyś skorzystać ze zwykłej pętli tutaj. Nie mniej jednak problem poruszony przez autora jest "specyficzny" dla funkcji rekurencyjnych.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 14.06.2025 - 15:16