Javascript setInterval不起作用

时间:2012-01-08 18:00:40

标签: javascript setinterval

我需要每10秒运行一次javascript函数。

我理解语法必须像下面一样工作,但我没有取得任何成功:

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

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

但这不起作用。有什么帮助吗?

4 个答案:

答案 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();立即调用该函数并指定返回值。
  • 即使您使用setInterval的错误且已弃用的类似eval的语法,只要"func"无效。调用函数eval-like将是setInterval("func()", 10000)

答案 3 :(得分:3)

试试这个:

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

var run = setInterval(funcName, 10000)