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

我了解语法必须像下面那样工作,但是我没有获得任何成功:

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

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

但这是行不通的。有什么帮助吗?

最佳答案

许多其他答案都集中在有效的模式上,但是对于当前代码为何不起作用的解释并不十分详尽。

您的代码,以供引用:

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);

在这种情况下,由于我不在乎该函数的名称,因此我只在其中保留了一个通用的,未命名的(匿名)函数。

关于javascript - JavaScript setInterval无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8779845/

10-09 23:29