我想立即第一次运行我的功能(没有超时)所以我这样做:
setInterval(function(){
alert("Boo");
}(), 1000);
第一次执行的功能但在下一个时间间隔内没有任何反应。为什么呢?
答案 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);
但是我建议你在间隔之外声明这个函数。