2

我想在第一时间立即运行我的函数(没有超时)所以我这样做:

setInterval(function(){
    alert("Boo");
}(), 1000);

该函数第一次执行,但在接下来的时间间隔内,什么也没发生。为什么?

4

7 回答 7

6

更好的问题是,您实际上想要实现什么?

return自调用函数没有任何内容,因此它将undefined隐式返回值,该值被传递给setTimeout. 在最初的电话之后,这条线看起来像

setInterval(undefined, 1000); 

显然,这没有任何意义,也不会继续调用任何东西。

您要么需要从自调用函数到return另一个函数,要么只是不使用自调用函数而只是传递函数引用。


更新:

你更新了你的问题。如果你想在 init 上运行一个函数“一次”,然后在间隔内使用它,你可以做类似的事情

setInterval((function() {
    function loop() {
        alert('Boo');
    };

    loop();
    return loop;
}()), 1000);
于 2012-12-07T22:18:17.627 回答
3

设置间隔需要函数引用,而不是函数返回的未定义。只需删除匿名函数末尾的“()”即可。

于 2012-12-07T22:18:45.800 回答
3

这是因为它是被调用的,而不是被传递的。如果您想要立即调用,只需给它一个名称,然后返回它。

setInterval(function foo() { 
    alert("boo"); 
    return foo; 
}(), 1000);

这称为命名函数表达式。您应该知道,在大多数浏览器中,foo标识符仅在内部可用foo,但较旧的 IE 存在导致标识符泄漏到外部范围的问题。

这通常不是问题,但您在选择函数名称时应该注意这一点。

于 2012-12-07T22:24:48.190 回答
2

因为setInterval“看到”的是您的自动执行功能的返回undefined- .

试试这个:

    setInterval(function()
        {
             alert("Boo");
             return arguments.callee;

        }(), 1000);

注意:
正如我讨厌懒惰指出的那样,严格模式arguments.callee是不允许的。

于 2012-12-07T22:20:16.583 回答
2

这是我过去所做的方法:

(function loop () {
   // do stuff
   window.setTimeout(loop, 1000);
})();
于 2012-12-07T22:33:15.210 回答
1

您自己执行的函数不会返回用作 的参数的函数setInterval,因此它在调用之前显示警报,setInterval而不是setInterval本质上是无操作的。

setInterval如果你愿意,你可以看到 Firefox 抱怨空调用。

于 2012-12-07T22:21:01.623 回答
1

你可以这样写:

setInterval((function() {
    function boo() {
        alert("boo");
    };
    boo();
    return boo;
})(), 1000);​

但我建议您在区间之外声明该函数。

于 2012-12-07T22:24:42.277 回答