Funkcja z parametrem wywołująca sama siebie

0

witam
Zacząłem uczyć się programowania w javascripcie i mam pewien problem. Mianowicie w wywoływaniu funkcji przez samą siebie ze zmniejszającym się parametrem przy każdym wywołaniu. Może podam przykład.
Prosta funkcja, która przyjmuje parametr 'liczba' i wypisuje w konsoli mniejszą liczbą o 1, aż dojdzie do 0.

Jeśli zapiszę tak, to nie działa:

function ZmniejajOJeden(liczba) {
    if (liczba > 0) {
        console.log(liczba--);
        setTimeout(ZmniejajOJeden, 500);
    }
};

A jeśli obuduje warunek w funkcję bez parametru i wywołam w funkcji ZmniejszajOJeden, to działa :

function ZmniejajOJeden(liczba) {

    function ZmniejszajOJedenWewn() {
        if (liczba > 0) {
            console.log(liczba--);
            setTimeout(ZmniejszajOJedenWewn, 500);
        }
    };

    ZmniejszajOJedenWewn();
};

Czy możecie mi wytłumaczyć dlaczego tak się dzieje, bo na prawdę nie rozumiem.

1

Twoja funkcja ZmniejajOJeden przyjmuje argument (którego nie przekazujesz przez setTimeout), podczas gdy ZmniejszajOJedenWewn opiera się o zmienną będącą argumentem w funkcji-rodzicu (zatem automatycznie dzieloną z funkcjami wewnątrz niej).

1

Prawidłowo:

function zmieniajOJeden(liczba) {
  if (liczba > 0) {
    console.log(liczba)
    setTimeout(zmieniajOJeden, 500, --liczba)
  }
}

lub

function zmieniajOJeden(liczba) {
  if (liczba > 0) {
    console.log(liczba)
    setTimeout(() => zmieniajOJeden(--liczba), 500)
  }
}
0

Można przekazać parametr do setTimeout [setTimeout(function, milliseconds, param1, param2, ...)]

function ZmniejajOJeden(liczba) {
    if (liczba > 0) {
        console.log(liczba);
        setTimeout(ZmniejajOJeden, 500, liczba - 1);
    }
};
0
Patryk27 napisał(a):

Twoja funkcja ZmniejajOJeden przyjmuje argument (którego nie przekazujesz przez setTimeout), podczas gdy ZmniejszajOJedenWewn opiera się o zmienną będącą argumentem w funkcji-rodzicu (zatem automatycznie dzieloną z funkcjami wewnątrz niej).

Dzięki za odpowiedź, ale jeszcze nie nadążam. Więc przekazałem parametr:

function ZmniejajOJeden(liczba) {

    if (liczba > 0) {
        console.log(liczba--);
        setTimeout(ZmniejajOJeden(liczba), 500);
    }
};

ale teraz nie czeka 500ms , tylko wyrzuca wszystkie liczby 'na raz'....

reptile333 napisał(a):

Można przekazać parametr do setTimeout [setTimeout(function, milliseconds, param1, param2, ...)]

function ZmniejajOJeden(liczba) {
    if (liczba > 0) {
        console.log(liczba);
        setTimeout(ZmniejajOJeden, 500, liczba - 1);
    }
};

wielkie dzięki o taki coś mi chodziło :). Tylko dlaczego parametr muszę przekazywać w taki sposób a nie mogę np, tak :

setTimeout(ZmniejajOJeden(liczba),500);
0

@Zimny Wąż

Do setTimeout musisz przekazać definicję funkcji, a nie jej wywołanie - setTimeout sam ją sobie wywoła w odpowiednim czasie, inaczej silnik JSa wywoła ją natychmiast.

0

aa to już rozumiem. Wielkie dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1