如何在JavaScript中从内部调用匿名函数?

时间:2012-11-16 08:09:32

标签: javascript

是否可以重新运行'check'函数而不在else语句中调用check()?也许以某种方式打电话给自己?

如果我有这个函数的多个实例,它们最终会相互调用,除非我将它更改为check1,check2等。虽然这是可能的。作为一个性能杀手,我只是在试用原型应用程序。

(function check () {
  if (typeof foo !='undefined') {
    // do stuff
  } else {
    console.log("Failed to load, trying again");
    setTimeout(function(){ check(); }, 10);
  }
})();

3 个答案:

答案 0 :(得分:6)

好吧,你可以使用arguments.callee来调用它,但这是一个坏主意,性能损失,并且在严格模式下无效。

您引用的内容是有效的JavaScript,不应check调用另一个check函数,如果您有一个check函数。遗憾的是,it will in IE8 and earlier因为他们错误地将名称(function() { // A check function check(); function check () { if (typeof foo !='undefined') { // do stuff } else { console.log("Failed to load, trying again"); setTimeout(function(){ check(); }, 10); } } })(); (function() { // A complete different one check(); function check () { if (typeof foo !='undefined') { // do other stuff } else { console.log("Failed to load, trying again"); setTimeout(function(){ check(); }, 10); } } })(); 泄漏到周围的范围(命名函数表达式)不会像函数声明那样将函数名称添加到周围的范围中 - 除了IE8及更早版本[并不是所有人都错了]。

所以解决方案是使用匿名函数隐藏命名函数:

{{1}}

答案 1 :(得分:3)

如何使用间隔而不需要调用自身,因为这将自动完成,直到您清除间隔:

(function(){
   var interval = setInterval(function(){
      if(typeof foo != 'undefined'){
         clearInterval(interval);
         // do stuff
      }else{
         console.log("Failed to load, trying again");
      }
   },10)
})();

答案 2 :(得分:0)

为什么不这样做呢:

var inter;

function check() {
    if (typeof foo !== 'undefined') {
        clearInterval(inter);
        // do stuff
    } else {
        console.log("Failed to load, trying again");
    }
}
inter = setInterval(check, 10);

这不是替代品,但我认为它的风格更好。