Ответ 1
Многие другие ответы сосредоточены на шаблоне, который действительно работает, но их объяснения на самом деле не очень тщательны относительно того, почему ваш текущий код не работает.
Ваш код для справки:
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);
В этом случае, поскольку мне все равно, как вызывается эта функция, я просто оставляю здесь общую, неназванную (анонимную) функцию.