2012-04-16 7 views
46

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

+6

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)' –

Odpowiedz

76

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) 
+1

odpowiedź poprawnie wskazuje, że funkcja callback nie powinna mieć "()" w argumencie. – Kristian

+2

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. –

+0

zgodnie z linkiem Crend King, mozilla jest do bani. – nothrow

8

setInterval i setTimeoutmusi 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.