2012-01-08 4 views
17

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

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

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

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

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

+0

Это всегда хорошая идея, чтобы узнать, что говорит консоль ошибок вашего браузера в этих ситуациях. – Bojangles

+0

Знаете ли вы, что происходит, когда вы передаете '' func'' 'to' SetInterval' и какое значение имеет значение 'func'? Всегда полезно прочитать [некоторую документацию] (https://developer.mozilla.org/en/window.setInterval). –

+0

Передача строки в 'setInterval()' (как правило, это плохая идея в первую очередь) заставляет ее выполнять 'eval (" func ")'.Это по существу то же самое, что и строка javascript: 'func;', которая ничего не делает. В качестве строки вы должны фактически выполнить функцию типа 'setInterval (" func() ", 10000)', но гораздо лучше просто передать фактическое имя функции, например 'setInterval (funcName, 10000)' и никогда не заставлять ее используйте 'eval()' в первую очередь. – jfriend00

ответ

95

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

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

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 is evil, так что вы должны стараться избегать ее, когда это возможно.

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

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

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

+4

Благодарим вас за четкий ответ! – mauzilla

2

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

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

setInterval(funcName, 10000); 

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

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

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

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

var run = setInterval(funcName, 10000) 
4

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

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