在JavaScript中使用setInterval()函数

Usage of setInterval() function in JavaScript

本文关键字:函数 setInterval JavaScript      更新时间:2023-09-26

我不明白为什么下面的代码不起作用。

function doSome(){
    console.log("Hi");
}
setInterval(doSome(), '1000');

我所期望的:

// every second
Hi
Hi
Hi
...

但结果

TypeError: Cannot read property 'call' of undefined
    at wrapper [as _onTimeout] (timers.js:275:18)
    at Timer.listOnTimeout (timers.js:92:15)

好的,如果我把setInterval(doSome(), '1000');改成setInterval(function(){doSome()}, '1000');,代码工作得很好。但我不知道有什么不同,也不知道为什么我必须像function(){...}一样包装函数。你能告诉我一些提示吗,谢谢。。。

代码的问题是setIntegal希望第一个参数是对函数的引用,而doSome()将计算为某个值,在本例中为null

您想要的是以下内容:

function doSome(){
  console.log("hi");
}
setInterval(doSome, 1000);

正如您所指出的,您还可以使用一个匿名函数(它返回对该函数的引用),该函数调用您真正想要执行的函数。这对于调用接受参数的函数非常有用。

function doMore(x, y){
  if (x < y)
    console.log("Hi");
  else
    console.log("Bye");
}
setInterval(function(){ doMore(0,1);}, 1000);

第二个示例很简单,但显示了如何使用setInterval调用需要参数的函数。

当你不使用匿名函数,即命名函数时,你会用括号调用它,所以删除它,它就会正常工作:

setInterval(doSome, 1000);//You still don't need to wrap interval time within string

问题是setInterval需要一个函数作为它的第一个参数
JavaScript的美妙之处在于,您甚至可以从doSome:返回一个函数

function doSome(param){
    return function() { console.log(param); }
}
setInterval(doSome("Hi"), 1000);

当然,正确的答案是:

function doSome(){
    return console.log("Hi");
}
setInterval(doSome, 1000);