--- title: Co poszło nie tak? Rozwiązywanie problemów w JavaScript slug: Learn/JavaScript/First_steps/What_went_wrong translation_of: Learn/JavaScript/First_steps/What_went_wrong original_slug: Learn/JavaScript/Pierwsze_kroki/Co_poszlo_nie_tak ---
Kiedy w poprzednim artykule budowałeś grę "Zgadnij numer", mogłeś stwierdzić, że ona po prostu nie działała. Nie martw się - ten artykuł ma na celu zatrzymanie cię przed wyrywaniem sobie włosów nad takimi problemami poprzez dostarczenie ci narzędzi do znajdowania i naprawienia błędów w programach napisanych w JavaScript.
Wymagania wstępne: | Podstawowa znajomość obsługi komputera, podstawowe rozumenie HTML i CSS oraz wiedza, czym jest JavaScript. |
---|---|
Cel: | Zdobycie umiejętności i odwagi do rozwiązywania prostych problemów w twoim własnym kodzie. |
Każdy błąd w kodzie można w ogólności podzielić na dwa typy:
No dobra, nie jest to tak proste - istnieją także inne czynniki, które różnicują błędy. Powyższa klasyfikacja wystarczy jednak w tym początkowym etapie twojej kariery. W kolejnej częsci przyjrzymy się tym dwóm typom błędów.
Zaczniemy od naszej poprzedniej gry "Zgadnij numer" - tylko że tym razem będziemy zajmować się wersją w której umyślnie ukryto trochę błędów. Odwiedź GitHub i wykonaj lokalną wersję number-game-errors.html (Zobacz live demo tutaj).
Notatka: Równie dobrze możesz mieć swoją wersję gry, która ci nie działa. Wiemy, że może chciałbyś ją naprawić, ale chcemy, abyś wykorzystał naszą wersję, dzięki czemu nauczysz się technik, których tu uczymy. Następnie możesz wykorzystać je do naprawienia własnego kodu.
W tym miejscu spójrzmy na narzędzia developerskie, dokładniej konsolę debugowania, aby sprawdzić, czy występują błędy składniowe, a jeżeli tak - naprawić je. Poniżej znajdują się instrukcje, jak tego dokonać.
Wcześniej pokazaliśmy kilka prostych komend JavaScript, które wpisałeś do konsoli JavaScript w narzędziach deweloperskich (jeżeli nie pamiętasz jak je otworzyć, kliknij w link, aby sobie przypomnieć). Jej bardzo przydatną funkcją jest wyświetlanie błędów w momencie gdy interpreter JavaScript przeglądarki napotka na błąd. Wyruszmy na poszukiwanie błędów!
number-game-errors.html
i otwórz konsolę JavaScript. Znajdziesz tam błąd:guessSubmit.addeventListener('click', checkGuess);
addEventListener()
.addeventListener
to addEventListener
should fix this. Do this now.Note: See our TypeError: "x" is not a function reference page for more details about this error.
Null
jest specjalną wartością, która oznacza "nic" bądź "brak wartości" A więc lowOrHi
został zadeklarowany i zainicjalizowany - ale wartością pustą.checkGuess() { ... }
). Jak dowiesz się później bardziej szczegółowo, kod wewnątrz funkcji jest wykonywany w innej przestrzeni niż kod poza funkcją. W tym przypadku kod nie został uruchomiony, a błąd wyrzucony do momentu, aż funkcja checkGuess()
nie dotarła do linijki 86.lowOrHi.textContent = 'Last guess was too high!';
textContent
zmiennej lowOrHi
na tekst, ale to się nie powiodło ze względu na fakt, że lowOrHi
nie jest tym, czego oczekujemy. Trzeba się dowiedzieć, dlaczego tak jest - wyszukajmy inne wystąpienia lowOrHi
. Najwcześniejsze wystąpienie znajdziemy w linii 48:
var lowOrHi = document.querySelector('lowOrHi');
console.log(lowOrHi);
Notatka: console.log()
jest bardzo użyteczną funkcją do debugowania, której celem jest wypisanie wartości zmiennej do konsoli. W tym przypadku wypisze ona wartośćlowOrHi
do konsoli w takiej postaci, w jakiej została ona ustawiona w linii 48.
console.log()
.Możemy być pewni - w tym momencie wartością lowOrHi
jest null
. Oznacza to, że błąd jest zdecydowanie związany z linią 48.document.querySelector()
aby otrzymać referencję do elementu. Odbywa się to poprzez podanie selektora CSS jako parametr funkcji. W dalszej częsci pliku można znaleźć paragraf, którego referencji potrzebujemy:
<p class="lowOrHi"></p>
querySelector()
(linia 48) nie ma kropki. To może być nasz błąd! Spróbuj zmienić lowOrHi
na .lowOrHi
w linii 48.console.log()
powinien wyświetlić element <p>
, którego poszukiwaliśmy. Uff! Kolejny błąd naprawiony! Możesz już usunąć linię z console.log()
(albo zostawić ją odniesienie na później - jak uważasz).Note: See our TypeError: "x" is (not) "y" reference page for more details about this error.
addeventListener
na .addEventListener
. Zrób to teraz.Na tym etapie gra powinna być grywalna, ale po kilku uruchomieniach można łatwo zauważyć, że "losowa" liczba to zawsze 0 bądź 1. Nie jest to to, czego można od takiej gry oczekiwać!
Musi to być jakiś problem z logiką aplikacji - gra nie zwraca błędu, jednak nie zachowuje się jak powinna.
randomNumber
i linie, w których zmienna jest zadeklarowana i jej wartość ustalona. To miejsce znajduje się w okolicach linii 44:
var randomNumber = Math.floor(Math.random()) + 1;A linia, która generuje losową liczbę przed każdą grą, to linia 113:
randomNumber = Math.floor(Math.random()) + 1;
console.log()
. Wstaw następujący kod bezpośrednio pod wcześniej wymienionymi dwiema liniami kodu:
console.log(randomNumber);
randomNumber
jest równe 1.W celu naprawy tego błędu, należy najpierw pomyśleć, jak działa ten kod. Na samym początku wywołujemy Math.random()
, który generuje zmiennoprzecinkową liczbę pomiędzy 0 i 1, na przykład 0.5675493843.
Math.random()
Następnie uzyskaną liczbę podajemy jako parametr funkcji Math.floor()
, której zadanie jest zaokrąglenie uzyskanej w parametrze liczby do największej liczby całkowitej równej bądź mniejszej od parametru. Następnie dodajemy 1 do wyniku:
Math.floor(Math.random()) + 1
Zaokrąglanie liczby zmiennoprzecinkowej w zakresie od 0 do 1 zawsze da 0 . Dodanie do niej 1 da więc wynik 1. Aby naprawić wynik zgodnie z wymaganiami, pomnóżmy naszą losową liczbę przez 100. Sprawi to, że dostaniemy losową liczbę od 0 do 99:
Math.floor(Math.random()*100);
Jeżeli dodamy 1, dostaniemy liczbę z przedziału od 1 do 100:
Math.floor(Math.random()*100) + 1;
Zmień obie linie zgodnie z tym wzorem, zapisz i odśwież stronę - gra powinna zachowywać się tak jak od niej tego oczekujemy!
Istnieją inne popularne błędy, na które natkniesz się w swoim kodzie. Ta sekcja zawiera listę najpopularniejszych z nich.
Ten błąd oznacza, że zapomniałeś o średniku na końcu linii. Czasem może jednak być bardziej enigmatyczny. Przykładem może być zmiana tej linii:
var userGuess = Number(guessField.value);
na
var userGuess === Number(guessField.value);
Ten kod wyrzuca błąd, gdyż myśli, że chcesz zrobić coś innego. Musisz być pewny, że nie mieszasz znaku przypisania (=
) — zapisuje on wartość w zmiennej, z operatorem dokładnego porównania, który testuje czy jedna wartość jest dokładnie równa drugiej - zwraca ona wynik w postaci zmiennej logicznej true
/false
.
Notatka: Aby dowiedzieć się więcej o tym błędzie, odwiedź naszą stronę SyntaxError: missing ; before statement.
Może to być objawem pomieszania operatorów przypisania i dokładnego porównania. Przykładowo jeżeli byśmy zmienili tę linię w funkcji checkGuess()
:
if (userGuess === randomNumber) {
na
if (userGuess = randomNumber) {
ten test zawsze zwróciłby true
(prawdę), co sprawiłoby, że program za każdym razem twierdziłby, że gra została przez Ciebie wygrana. Uważaj na błędy!
Ten błąd jest prosty — oznacza po prostu, że zapomniałeś dodać nawias zamykający na końcu funkcji/wywołania metody.
Notatka: Zobacz naszą stronę referencyjną: SyntaxError: missing ) after argument list, aby dowiedzieć się więcej o tym błędzie.
Ten błąd zwykle jest związany z niepoprawnie napisanym obiektem JavaScript. Tym razem jednak został spowodowany zmianą
function checkGuess() {
na
function checkGuess( {
Ten błąd spowodował, że przeglądarka zinterpretowała ten kod jako próbę podania wnętrza funkcji jako parametr funkcji. Uważaj na nawiasy!
This is easy — it generally means that you've missed one of your curly braces from a function or conditional structure. We got this error by deleting one of the closing curly braces near the bottom of the checkGuess()
function.
These errors generally mean that you've missed off a string value's opening or closing quote mark. In the first error above, string would be replaced with the unexpected character(s) that the browser found instead of a quote mark at the start of a string. The second error means that the string has not been ended with a quote mark.
For all of these errors, think about how we tackled the examples we looked at in the walkthrough. When an error arises, look at the line number you are given, go to that line and see if you can spot what's wrong. Bear in mind that the error is not necessarily going to be on that line, and also that the error might not be caused by the exact same problem we cited above!
Note: See our SyntaxError: Unexpected token and SyntaxError: unterminated string literal reference pages for more details about these errors.
A wieć to jest to - podstawy szukania błędów w prostych programach w JS. Nie zawsze znalezienie błędu jest tak proste , ale przynajmniej ten artykuł może ci pomóc w zaoszczędzeniu kilku godzin snu i pozwolić na szybsze postępy w nauce.
{{PreviousMenuNext("Learn/JavaScript/First_steps/A_first_splash", "Learn/JavaScript/First_steps/Variables", "Learn/JavaScript/First_steps")}}