Mam ten licznik, który zrobiłem, ale chcę, żeby działał wiecznie, to naprawdę proste, co ja tu robię źle?wywołanie setInterval działa tylko raz
Odpowiedz
Użyłeś wywołania funkcji zamiast odwołania do funkcji jako pierwszego parametru setInterval. Czy to tak:
function timer() {
console.log("timer!");
}
window.setInterval(timer, 1000);
lub krótszy (ale gdy funkcja dostaje większe również mniej czytelny):
window.setInterval(function() {
console.log("timer!");
}, 1000)
odpowiedź poprawnie wskazuje, że funkcja callback nie powinna mieć "()" w argumencie. – Kristian
Zgodnie z https://developer.mozilla.org/en/Extensions/Common_causes_of_memory_leaks_in_extensions#Be_careful_with_setInterval.2FsetTimeout, krótsza wersja może spowodować wyciek pamięci. –
zgodnie z linkiem Crend King, mozilla jest do bani. – nothrow
setInterval
i setTimeout
musi być używany z wywołań zwrotnych, takich jak:
setInterval(timer, 1000);
lub funkcje bez nazwy:
setInterval(function() { console.log("timer!"); }, 1000);
Dlaczego twój kod nie działa - kiedy przekazujesz funkcję jako argument do innej funkcji z nawiasami np. doSomething (someFunc())
przechodzisz wynik działania funkcji.
Gdy funkcja jest przekazywana jako obiekt, np. doSomething (someFunc)
przechodzisz oddzwonienie. W ten sposób someFunc
jest przekazywane jako odniesienie i jest wykonywane gdzieś w funkcji wywołującej. Jest to to samo co wskaźniki do funkcji w innych językach.
Typowym błędem jest użycie tych dwóch funkcji, jak pokazano na w3schools. To powoduje niejawne wywołanie do eval
.
Problem polega na tym, że 'timer()' wywołuje funkcję-obiekt, która wynika z oceny 'timera', a następnie przekazuje wynik (' undefined') do 'setTimeout'. Więc nie wzywaj tego. Zamiast tego wystarczy przekazać obiekt funkcji: 'setInterval (timer, 1000)' –