Почему обратный вызов setInterval выполняется только один раз?

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

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

window.setInterval(timer(), 1000)

person computer_smile    schedule 16.04.2012    source источник
comment
Проблема в том, что timer() вызывает объект-функцию, полученную в результате оценки timer, а затем передает результат (undefined) в setTimeout. Так что не вызывайте его. Вместо этого просто передайте объект-функцию: setInterval(timer, 1000)   -  person    schedule 17.04.2012


Ответы (2)


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

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

window.setInterval(timer, 1000);

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

window.setInterval( function() {
  console.log("timer!");
}, 1000)
person Koen Peters    schedule 16.04.2012
comment
ответ правильно указывает, что функция обратного вызова не должна иметь () в аргументе. - person Kristian; 17.04.2012
comment
Согласно developer.mozilla.org/en/Extensions/, более короткая версия может вызвать утечку памяти. - person Crend King; 17.04.2012
comment
@CrendKing Обе версии имеют одинаковую проблему (также для расширений и не влияют на обычные веб-страницы/JS), поскольку имеет значение срок жизни объекта. - person ; 17.04.2012
comment
Вот почему я сказал «может», поскольку OP не указывает свой вариант использования. Просто обратите внимание, если он извлечен из расширения Mozilla. - person Crend King; 17.04.2012
comment
Как мы можем изменить значение интервала, например. У меня есть массив [10, 5, 2] и я хочу вызвать timer() на основе интервала, определенного в массиве. Спасибо! - person OverrockSTAR; 09.03.2017
comment
Вы не можете использовать setInterval, но вы можете имитировать это с помощью функции setTimeout. - person Koen Peters; 09.03.2017

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

setInterval(timer, 1000);

или безымянные функции:

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

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

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

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

person Bakudan    schedule 17.04.2012