1

是否可以在 else 语句中不调用 check() 重新运行函数“check”?也许以某种方式称呼自己?

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

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

3 回答 3

6

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

您引用的是有效的 JavaScript,如果您旁边有一个函数,则不应调用check另一个函数。check可悲的是,它会在 IE8 和更早版本中出现,因为它们完全错误地将名称泄漏check到周围范围(命名函数表达式不会像函数声明那样将函数名称添加到周围范围 - 除了在 IE8 和更早版本上 [这还不是全部他们弄错了])。

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

(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);
      }
    }
})();
于 2012-11-16T08:13:12.837 回答
3

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

(function(){
   var interval = setInterval(function(){
      if(typeof foo != 'undefined'){
         clearInterval(interval);
         // do stuff
      }else{
         console.log("Failed to load, trying again");
      }
   },10)
})();
于 2012-11-16T08:20:25.583 回答
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);

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

于 2012-11-16T08:17:54.317 回答