Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JS] Włąsna funkcja reaz zwraca true a raz undifined
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
pehaperowiec
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?
Crozin
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.
PrinceOfPersia
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);
}


pehaperowiec
1) Jak debugować kod JS?
2) Dlaczego dokładniej return zagadka() ?
3) Dlaczego alert albo console.log jest lepsza?
viking
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.
Crozin
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.
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.