Многие другие ответы сосредоточены на шаблоне, который действительно работает, но их объяснения на самом деле не очень подробны относительно того, почему ваш текущий код не работает.
Ваш код, для справки:
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);
В этом случае, так как я не волнует, что функция называется, я просто оставить общий безымянный (анонимный) функции, там.
Это всегда хорошая идея, чтобы узнать, что говорит консоль ошибок вашего браузера в этих ситуациях. – Bojangles
Знаете ли вы, что происходит, когда вы передаете '' func'' 'to' SetInterval' и какое значение имеет значение 'func'? Всегда полезно прочитать [некоторую документацию] (https://developer.mozilla.org/en/window.setInterval). –
Передача строки в 'setInterval()' (как правило, это плохая идея в первую очередь) заставляет ее выполнять 'eval (" func ")'.Это по существу то же самое, что и строка javascript: 'func;', которая ничего не делает. В качестве строки вы должны фактически выполнить функцию типа 'setInterval (" func() ", 10000)', но гораздо лучше просто передать фактическое имя функции, например 'setInterval (funcName, 10000)' и никогда не заставлять ее используйте 'eval()' в первую очередь. – jfriend00