我想在第一时间立即运行我的函数(没有超时)所以我这样做:
setInterval(function(){
alert("Boo");
}(), 1000);
该函数第一次执行,但在接下来的时间间隔内,什么也没发生。为什么?
我想在第一时间立即运行我的函数(没有超时)所以我这样做:
setInterval(function(){
alert("Boo");
}(), 1000);
该函数第一次执行,但在接下来的时间间隔内,什么也没发生。为什么?
更好的问题是,您实际上想要实现什么?
return
自调用函数没有任何内容,因此它将undefined
隐式返回值,该值被传递给setTimeout
. 在最初的电话之后,这条线看起来像
setInterval(undefined, 1000);
显然,这没有任何意义,也不会继续调用任何东西。
您要么需要从自调用函数到return
另一个函数,要么只是不使用自调用函数而只是传递函数引用。
更新:
你更新了你的问题。如果你想在 init 上运行一个函数“一次”,然后在间隔内使用它,你可以做类似的事情
setInterval((function() {
function loop() {
alert('Boo');
};
loop();
return loop;
}()), 1000);
设置间隔需要函数引用,而不是函数返回的未定义。只需删除匿名函数末尾的“()”即可。
这是因为它是被调用的,而不是被传递的。如果您想要立即调用,只需给它一个名称,然后返回它。
setInterval(function foo() {
alert("boo");
return foo;
}(), 1000);
这称为命名函数表达式。您应该知道,在大多数浏览器中,foo
标识符仅在内部可用foo
,但较旧的 IE 存在导致标识符泄漏到外部范围的问题。
这通常不是问题,但您在选择函数名称时应该注意这一点。
因为setInterval
“看到”的是您的自动执行功能的返回undefined
- .
试试这个:
setInterval(function()
{
alert("Boo");
return arguments.callee;
}(), 1000);
注意:
正如我讨厌懒惰指出的那样,严格模式arguments.callee
是不允许的。
这是我过去所做的方法:
(function loop () {
// do stuff
window.setTimeout(loop, 1000);
})();
您自己执行的函数不会返回用作 的参数的函数setInterval
,因此它在调用之前显示警报,setInterval
而不是setInterval
本质上是无操作的。
setInterval
如果你愿意,你可以看到 Firefox 抱怨空调用。
你可以这样写:
setInterval((function() {
function boo() {
alert("boo");
};
boo();
return boo;
})(), 1000);
但我建议您在区间之外声明该函数。