![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 91 Pomógł: 8 Dołączył: 26.09.2011 Ostrzeżenie: (10%) ![]() ![]() |
Kod function zagadka() { Dlaczego raz zostaje wypisane undifined a raz true? Od czego to zależy?
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()); |
|
|
![]()
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. |
|
|
![]()
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); } -------------------- |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 91 Pomógł: 8 Dołączył: 26.09.2011 Ostrzeżenie: (10%) ![]() ![]() |
1) Jak debugować kod JS?
2) Dlaczego dokładniej return zagadka() ? 3) Dlaczego alert albo console.log jest lepsza? |
|
|
![]()
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. -------------------- |
|
|
![]()
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. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.06.2025 - 15:16 |