2012-04-16 4 views
46

У меня есть этот счетчик, который я сделал, но я хочу, чтобы он работал вечно, это действительно просто, что я делаю неправильно здесь?setInterval callback работает только один раз

function timer() { 
    console.log("timer!") 
} 

window.setInterval(timer(), 1000) 
+6

Проблема 'timer()' вызывает функцию-объект, полученный в результате вычисления 'timer', а затем передает результат (' undefined') в 'setTimeout'. Поэтому не вызывайте его. Вместо этого просто передайте функцию-объект: 'setInterval (timer, 1000)' –

ответ

76

В качестве первого параметра setInterval использовался вызов функции вместо ссылки на функцию. Делают это так:

function timer() { 
    console.log("timer!"); 
} 

window.setInterval(timer, 1000); 

Или короче (но когда функция становится все больше и менее читаемым):

window.setInterval(function() { 
    console.log("timer!"); 
}, 1000) 
+1

ответ правильно указывает, что функция обратного вызова не должна иметь «()» в аргументе. – Kristian

+2

Согласно https://developer.mozilla.org/en/Extensions/Common_causes_of_memory_leaks_in_extensions#Be_careful_with_setInterval.2FsetTimeout, более короткая версия может вызвать утечку памяти. –

+0

согласно ссылке Crend King, mozilla sucks. – nothrow

8

setInterval и setTimeoutдолжны использоваться с обратными вызовами, как:

setInterval(timer, 1000); 

или неназванные функции:

setInterval(function() { console.log("timer!"); }, 1000); 

Почему ваш код не работает - когда вы передаете функцию в качестве аргумента другой функции с помощью скобок, например. doSomething (someFunc()) вы передаете результат функции.

Когда функция передается как объект, например. doSomething (someFunc) вы проходите обратный вызов. Таким образом, someFunc передается как ссылка и выполняется где-то в вызывающей функции. Это то же самое, что и указатели на функции на других языках.

Общей ошибкой является использование этих двух функций, как показано на этапе w3schools. Это делает неявный вызов eval.

Смежные вопросы