我不明白为什么代码不能正常工作。
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(){...}
那样包装函数你能告诉我一些提示,谢谢......
答案 0 :(得分:2)
代码的问题是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
调用需要参数的函数。
答案 1 :(得分:1)
当你不使用匿名函数时。命名函数,然后你使用括号调用它,所以删除它,并将工作正常:
setInterval(doSome, 1000);//You still don't need to wrap interval time within string
答案 2 :(得分:1)
问题是setInterval
需要一个函数作为它的第一个参数
JavaScript的优点在于您甚至可以从doSome
返回一个函数:
function doSome(param){
return function() { console.log(param); }
}
setInterval(doSome("Hi"), 1000);
但当然正确答案是:
function doSome(){
return console.log("Hi");
}
setInterval(doSome, 1000);