Javascript setInterval不起作用

mau*_*lla 25 javascript setinterval

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

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

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

var func = funcName();
var run = setInterval("func",10000)
Run Code Online (Sandbox Code Playgroud)

但这不起作用.有帮助吗?

Rei*_*eid 109

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

您的代码,供参考:

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

var func = funcName();
var run = setInterval("func",10000)
Run Code Online (Sandbox Code Playgroud)

让我们把它分成几块.你的功能funcName很好.请注意,当您致电funcName(换句话说,您运行它)时,您将发出警报"test".但请注意funcName()- 括号表示"调用"或"运行"该函数 - 实际上并不返回值.当函数没有返回值时,它默认为一个称为的值undefined.

调用函数时,将其参数列表附加到括号中的末尾.如果没有任何参数来传递函数,只需添加空括号即可funcName().但是当你想要引用函数本身而不是调用它时,你不需要括号,因为括号表示要运行它.

所以,当你说:

var func = funcName();
Run Code Online (Sandbox Code Playgroud)

您实际上是在声明func一个值为的变量funcName().但请注意括号.funcName()实际上是返回值funcName.如上所述,由于funcName实际上没有返回任何值,因此默认为undefined.换句话说,您的变量func实际上将具有该值undefined.

然后你有这条线:

var run = setInterval("func",10000)
Run Code Online (Sandbox Code Playgroud)

该函数setInterval有两个参数.第一个是经常运行的函数,第二个是每次运行函数之间的毫秒数.

但是,第一个参数确实应该是一个函数,而不是一个字符串.如果它是一个字符串,那么JavaScript引擎将使用eval该字符串代替.换句话说,您的setInterval正在运行以下JavaScript代码:

func
// 10 seconds later....
func
// and so on
Run Code Online (Sandbox Code Playgroud)

但是,func它只是一个变量(带有值undefined,但这有点无关紧要).所以每十秒钟,JS引擎就会评估变量func并返回undefined.但这并没有真正做任何事情.我的意思是,它在技术上每10秒进行一次评估,但你不会看到任何影响.

解决方案是提供setInterval一个函数来运行而不是字符串.所以,在这种情况下:

var run = setInterval(funcName, 10000);
Run Code Online (Sandbox Code Playgroud)

请注意,我没有给它func.这是因为,func不是在你的代码的函数; 这是价值undefined,因为你分配了它funcName().就像我上面说的那样,funcName()将调用函数funcName并返回函数的返回值.由于funcName不返回任何内容,因此默认为undefined.我知道我现在已经好几次了,但这确实是一个非常重要的概念:当你看到时funcName(),你应该想到"回归价值funcName".当你想要引用一个函数本身时,就像一个单独的实体一样,你应该不用括号,所以你不要调用它:funcName.

因此,您的代码的另一个解决方案是:

var func = funcName;
var run = setInterval(func, 10000);
Run Code Online (Sandbox Code Playgroud)

但是,这有点多余:为什么要使用func而不是funcName

或者您可以通过修改两位来尽可能保持原始代码:

var func = funcName;
var run = setInterval("func()", 10000);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,JS引擎将func()每十秒进行一次评估.换句话说,它会"test"每十秒钟发出警报.然而,正如着名的短语所说,eval是邪恶的,所以你应该尽可能地避免它.

此代码的另一个转折是使用匿名函数.换句话说,一个没有名字的函数 - 你只需将它放在代码中,因为你不关心它的名字.

setInterval(function () {
    alert("test");
}, 10000);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,由于我不关心函数的调用,我只是在那里留下一个通用的,未命名的(匿名)函数.

  • 一方面,我可能会同意:在这8.5年的时间里,我一直在努力加强我的写作。另一方面,有 117 人对这个答案投了赞成票。 (9认同)

Thi*_*ter 6

那是因为你应该传递一个函数,而不是一个字符串:

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

setInterval(funcName, 10000);
Run Code Online (Sandbox Code Playgroud)

您的代码有两个问题:

  • var func = funcName();立即调用该函数并分配返回值。
  • "func"即使您使用 setInterval 的糟糕且已弃用的类似 eval 的语法,Just也是无效的。它将setInterval("func()", 10000)像 eval 一样调用该函数。


tec*_*bar 6

更改setInterval("func",10000)要么setInterval(funcName, 10000)setInterval("funcName()",10000).前者是推荐的方法.


qwe*_*ymk 5

尝试这个:

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

var run = setInterval(funcName, 10000)
Run Code Online (Sandbox Code Playgroud)