Javascript setInterval не работает - PullRequest
24 голосов
/ 08 января 2012

Мне нужно запускать функцию javascript каждые 10 секунд.

Я понимаю, что синтаксис должен работать следующим образом, но я не получаю никакого успеха:

function funcName() {
    alert("test");
}

var func = funcName();
var run = setInterval("func",10000)

Но это не работает. Любая помощь?

Ответы [ 4 ]

107 голосов
/ 08 января 2012

Многие другие ответы сосредоточены на шаблоне, который работает, но их объяснения на самом деле не очень подробны о том, почему ваш текущий код не работает.

Ваш код, для справки:

function funcName() {
    alert("test");
}

var func = funcName();
var run = setInterval("func",10000)

Давайте разбить это на куски.Ваша функция funcName в порядке.Обратите внимание, что когда вы звоните funcName (другими словами, вы запускаете его), вы будете предупреждать "test".Но обратите внимание, что funcName() - круглые скобки означают «вызвать» или «запустить» функцию - на самом деле не возвращает значение.Если функция не имеет возвращаемого значения, по умолчанию используется значение, известное как undefined.

Когда вы вызываете функцию, вы добавляете список аргументов в конец в скобках.Если у вас нет аргументов для передачи функции, вы просто добавляете пустые скобки, например funcName().Но когда вы хотите сослаться на саму функцию, а не вызывать ее, вам не нужны круглые скобки, потому что круглые скобки указывают на ее запуск.

Итак, когда вы говорите:

var func = funcName();

Вы на самом деле объявляете переменную func со значением funcName().Но обратите внимание на круглые скобки.funcName() фактически является возвращаемым значением funcName.Как я уже говорил выше, поскольку funcName фактически не возвращает никакого значения, по умолчанию используется undefined.Итак, другими словами, ваша переменная func на самом деле будет иметь значение undefined.

Тогда у вас есть эта строка:

var run = setInterval("func",10000)

Функция setInterval принимает два аргумента.Первая - это функция, которая запускается время от времени, а вторая - количество миллисекунд между каждым выполнением функции.

Однако первый аргумент действительно должен быть функцией, а не строкой.Если это строка, механизм JavaScript будет использовать eval в этой строке.Итак, другими словами, ваш setInterval выполняет следующий код JavaScript:

func
// 10 seconds later....
func
// and so on

Однако func - это просто переменная (со значением undefined, но это не имеет значения).Таким образом, каждые десять секунд механизм JS оценивает переменную func и возвращает undefined.Но это на самом деле ничего не делает.Я имею в виду, что технически это оценивается каждые 10 секунд, но вы не увидите никаких эффектов от этого.

Решение состоит в том, чтобы дать setInterval функцию для запуска вместо строки.Итак, в данном случае:

var run = setInterval(funcName, 10000);

Обратите внимание, что я не дал его func.Это потому, что func - это , а не функция в вашем коде;это значение undefined, потому что вы присвоили его funcName().Как я уже говорил выше, funcName() вызовет функцию funcName и вернет возвращаемое значение функции.Поскольку funcName ничего не возвращает, по умолчанию используется undefined.Я знаю, что уже говорил это несколько раз, но это действительно очень важная концепция: когда вы видите funcName(), вы должны думать, что «возвращаемое значение funcName».Если вы хотите сослаться на саму функцию , например на отдельную сущность, вы должны опустить скобки, чтобы не вызывать ее: funcName.

Итак, другое решение дляВаш код будет:

var func = funcName;
var run = setInterval(func, 10000);

Однако, это немного избыточно: зачем использовать func вместо funcName?

Или вы можете сохранить как можно больше истинного исходного кода, изменив два бита:

var func = funcName;
var run = setInterval("func()", 10000);

В этом случае механизм JS будет оценивать func() каждые десять секунд.Другими словами, он будет предупреждать "test" каждые десять секунд.Однако, как гласит известная фраза, eval - это зло , поэтому вы должны стараться избегать этого всякий раз, когда это возможно.

Еще один поворот в этом коде заключается в использовании анонимной функции.Другими словами, функция, у которой нет имени - вы просто добавляете ее в код, потому что вам все равно, как она называется.

setInterval(function () {
    alert("test");
}, 10000);

В этом случае, поскольку я неНе важно, как называется эта функция, я просто оставляю там общую неназванную (анонимную) функцию.

5 голосов
/ 08 января 2012

Измените setInterval("func",10000) на setInterval(funcName, 10000) или setInterval("funcName()",10000).Первый является рекомендуемым методом.

3 голосов
/ 08 января 2012

Попробуйте это:

function funcName() {
    alert("test");
}

var run = setInterval(funcName, 10000)
3 голосов
/ 08 января 2012

Это потому, что вы должны передать функцию, а не строку:

function funcName() {
    alert("test");
}

setInterval(funcName, 10000);

Ваш код имеет две проблемы:

  • var func = funcName(); немедленно вызывает функцию и назначает возвратзначение.
  • Просто "func" недопустимо, даже если вы используете неправильный и устаревший eval-подобный синтаксис setInterval.setInterval("func()", 10000) будет вызывать функцию, подобную eval.
...