我需要每10秒运行一次javascript函数。
我理解语法必须像下面一样工作,但我没有取得任何成功:
function funcName() {
alert("test");
}
var func = funcName();
var run = setInterval("func",10000)
但这不起作用。有什么帮助吗?
答案 0 :(得分:107)
许多其他答案都集中在一个有效的模式上,但是他们的解释并不是非常彻底地说明为什么你当前的代码不起作用。
您的代码,供参考:
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);
在这种情况下,由于我不关心函数的调用,我只是在那里留下一个通用的,未命名的(匿名)函数。
答案 1 :(得分:5)
将setInterval("func",10000)
更改为setInterval(funcName, 10000)
或setInterval("funcName()",10000)
。前者是推荐的方法。
答案 2 :(得分:3)
那是因为你应该传递一个函数,而不是一个字符串:
function funcName() {
alert("test");
}
setInterval(funcName, 10000);
您的代码有两个问题:
var func = funcName();
立即调用该函数并指定返回值。"func"
无效。调用函数eval-like将是setInterval("func()", 10000)
。答案 3 :(得分:3)
试试这个:
function funcName() {
alert("test");
}
var run = setInterval(funcName, 10000)