我需要每 10 秒运行一个 javascript 函数。
我知道语法必须像下面这样工作,但我没有取得任何成功:
function funcName() {
alert("test");
}
var func = funcName();
var run = setInterval("func",10000)
但这不起作用。有什么帮助吗?
原文由 mauzilla 发布,翻译遵循 CC BY-SA 4.0 许可协议
我需要每 10 秒运行一个 javascript 函数。
我知道语法必须像下面这样工作,但我没有取得任何成功:
function funcName() {
alert("test");
}
var func = funcName();
var run = setInterval("func",10000)
但这不起作用。有什么帮助吗?
原文由 mauzilla 发布,翻译遵循 CC BY-SA 4.0 许可协议
将 setInterval("func",10000)
更改为 setInterval(funcName, 10000)
或 setInterval("funcName()",10000)
。前者是推荐的方法。
原文由 techfoobar 发布,翻译遵循 CC BY-SA 3.0 许可协议
13 回答12.8k 阅读
7 回答1.9k 阅读
3 回答1.1k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
6 回答897 阅读✓ 已解决
6 回答1.1k 阅读
2 回答1.3k 阅读✓ 已解决
许多其他答案都集中在一个确实有效的模式上,但他们对为什么你当前的代码不起作用的解释并不是很彻底。
您的代码,供参考:
让我们把它分成几块。你的功能
funcName
。请注意,当您调用funcName
(换句话说,您运行它)时,您将收到警报"test"
。但请注意funcName()
括号中的意思是“调用”或“运行”该函数——实际上并不返回值。当一个函数没有返回值时,它默认为一个称为undefined
的值。当你调用一个函数时,你将它的参数列表附加到括号中的末尾。当您没有任何参数来传递函数时,只需添加空括号,例如
funcName()
。但是当你想引用函数本身而不是调用它时,你不需要括号,因为括号表示运行它。所以,当你说:
您实际上是在声明一个变量
func
其值为funcName()
。但请注意括号。funcName()
实际上是funcName
的返回值。正如我上面所说,由于funcName
实际上没有返回任何值,它默认为undefined
。因此,换句话说,您的变量func
实际上将具有值undefined
。然后你有这一行:
函数
setInterval
有两个参数。第一个是每隔一段时间运行的函数,第二个是每次运行函数之间的毫秒数。然而,第一个参数实际上应该是一个函数,而不是一个字符串。如果它是一个字符串,那么 JavaScript 引擎将在该字符串上使用
eval
代替。因此,换句话说,您的 setInterval 正在运行以下 JavaScript 代码:但是,
func
只是一个变量(值为undefined
,但这有点无关紧要)。因此,每十秒,JS 引擎评估变量func
并返回undefined
。但这并没有真正做任何事情。我的意思是,从技术上讲,它每 10 秒评估一次,但您不会看到任何影响。解决方案是给
setInterval
一个要运行的函数而不是一个字符串。所以,在这种情况下:请注意,我没有给它
func
。这是因为func
不是 您代码中的函数;它是值undefined
,因为你分配了它funcName()
。就像我上面说的,funcName()
将调用函数funcName
并返回函数的返回值。由于funcName
不返回任何内容,因此默认为undefined
。我知道我已经说过好几次了,但这确实是一个非常重要的概念:当您看到funcName()
时,您应该想到“funcName
的返回值”。当你想引用一个 函数本身 时,就像一个单独的实体一样,你应该去掉括号,这样你就不会调用它:funcName
。因此,您的代码的另一种解决方案是:
但是,这有点多余:为什么使用
func
而不是funcName
?或者您可以通过修改两位来尽可能保持原始代码的真实性:
在这种情况下,JS 引擎将每十秒评估一次
func()
。换句话说,它会每十秒提醒一次"test"
。然而,正如那句名言所说,eval
is evil ,所以你应该尽可能避免它。此代码的另一个变化是使用匿名函数。换句话说,一个没有名字的函数——你只是把它放在代码中,因为你不关心它叫什么。
在这种情况下,因为我不关心调用的函数是什么,所以我只在那里留下一个通用的、未命名(匿名)的函数。