繁体   English   中英

setInterval()函数在JavaScript中的用法

[英]Usage of setInterval() function in JavaScript

我不明白为什么底层代码无法正常工作。

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(){...}这样的function(){...} ,您能告诉我一些提示吗,谢谢...

您的代码的问题是setInteval期望第一个参数是对函数的引用,而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在于,您甚至可以从doSome返回一个函数:

function doSome(param){
    return function() { console.log(param); }
}

setInterval(doSome("Hi"), 1000);

但是,当然正确的答案是:

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

setInterval(doSome, 1000);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM