setInterval具有自执行功能

时间:2012-12-07 22:16:36

标签: javascript setinterval

我想立即第一次运行我的功能(没有超时)所以我这样做:

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

第一次执行的功能但在下一个时间间隔内没有任何反应。为什么呢?

7 个答案:

答案 0 :(得分:5)

更好的问题是,你究竟想要实现什么目标?

您没有return来自自调用函数的任何内容,因此它将隐式返回undefined值,并将其传递给setTimeout。在初始调用之后,该行看起来像

setInterval(undefined, 1000); 

这显然没有任何意义,也不会继续打电话。

您需要从自我调用函数中return另一个函数,或者只是不使用自调用函数并只是传递函数引用。


更新

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

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

    loop();
    return loop;
}()), 1000);

答案 1 :(得分:3)

设置间隔需要函数引用,而不是函数返回的undefined。只需删除匿名函数末尾的'()'。

答案 2 :(得分:3)

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

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

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

这通常不是问题,但在选择功能名称时应注意这一点。

答案 3 :(得分:2)

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

请改为尝试:

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

        }(), 1000);

注意:
正如我讨厌懒惰指出Strict Mode中不允许arguments.callee

答案 4 :(得分:2)

以下是我过去采用的方法:

(function loop () {
   // do stuff
   window.setTimeout(loop, 1000);
})();

答案 5 :(得分:1)

您自行执行的函数不返回用作setInterval的参数的函数,因此它在调用setInterval之前显示警报,而setInterval基本上没有操作。< / p>

如果你愿意,你可以看到Firefox抱怨对setInterval的空话。

答案 6 :(得分:1)

你可以这样写:

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

但是我建议你在间隔之外声明这个函数。