Javascript setInterval 不起作用

新手上路,请多包涵

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

我知道语法必须像下面这样工作,但我没有取得任何成功:

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

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

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

原文由 mauzilla 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

许多其他答案都集中在一个确实有效的模式上,但他们对为什么你当前的代码不起作用的解释并不是很彻底。

您的代码,供参考:

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

在这种情况下,因为我不关心调用的函数是什么,所以我只在那里留下一个通用的、未命名(匿名)的函数。

原文由 Reid 发布,翻译遵循 CC BY-SA 3.0 许可协议

setInterval("func",10000) 更改为 setInterval(funcName, 10000)setInterval("funcName()",10000) 。前者是推荐的方法。

原文由 techfoobar 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题