调用setInterval中定义的匿名函数

时间:2010-06-03 08:02:12

标签: javascript

我已经制作了这段代码:

window.setInterval(function(){ var a = doStuff(); var b = a + 5; }, 60000)

匿名函数的实际内容当然只适用于这个小例子,因为它无关紧要。真正发生的是在函数本身的范围内创建了一堆变量,因为我不需要/想要污染全局空间。

但是众所周知,doStuff()函数直到页面中的60秒才会被调用。我也想在页面加载后立即调用该函数,从那时起每隔60秒调用一次。

是否有可能在setInterval()行之后调用函数而不复制/粘贴内部代码?正如我所说,我不想用函数外部不需要的无用变量来污染全局空间。

3 个答案:

答案 0 :(得分:16)

您可以将回调函数放在变量中,并将所有内容包装在自调用匿名函数中:

(function () {
    var callback = function() { 
        var a = doStuff(); 
        var b = a + 5; 
    };

    callback();

    window.setInterval(callback, 60000);
})();

没有污染。

答案 1 :(得分:5)

这也可以不创建全局变量:

setInterval((function fn() {
 console.log('foo'); // Your code goes here
 return fn;
})(), 5000);

实际上,这样就根本不会创建任何变量。

但是,在Internet Explorer中,fn函数将可从周围范围访问(由于错误)。如果您不希望发生这种情况,只需将所有内容包装在一个自动调用的匿名函数中:

(function() {
 setInterval((function fn() {
  console.log('foo'); // Your code goes here
  return fn;
 })(), 5000);
})();

感谢保罗爱尔兰人sharing this trick


修改:通过bobince回复了一些更多信息。

答案 2 :(得分:0)

又一个解决方案:

(function() { 
    var a = doStuff(); 
    var b = a + 5; 
    window.setTimeout(arguments.callee, 60000);
})();

这使用超时而不是间隔,以便它可以在第一次运行,然后在超时后再次运行它。