调用setInterval中定义的匿名函数

Tom*_*tor 9 javascript

我做了这个代码:

window.setInterval(function(){ var a = doStuff(); var b = a + 5; }, 60000)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dan*_*llo 16

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

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

    callback();

    window.setInterval(callback, 60000);
})();
Run Code Online (Sandbox Code Playgroud)

没有污染.

  • +1而下面的代码完全有效,我觉得阅读起来很烦人. (3认同)

Mat*_*ens 5

这也可以在不创建全局变量的情况下实现:

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

实际上,通过这种方式,您根本不会创建任何变量.

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

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

感谢Paul Irish 分享这个技巧.


编辑:答案更新了更多信息,感谢bobince.

  • -1不,这不符合要求.它在全球空间中创建了`fn`.这就是巧妙伎俩的问题,很难预测他们实际在做什么. (2认同)
  • 即使没有包装器,它也不应该在周围的范围内创建函数.由于长期存在的JScript错误,它只能在IE中使用.更重要的是,在IE中,返回的`fn`实际上并不是与被调用的函数实例相同的函数实例!由于这些原因,通常应避免使用命名的内联函数表达式. (2认同)