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