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であり、それと一緒にある場合は別の関数を呼び出さないでください。残念ながら、IE8以前では、名前が周囲のスコープに誤ってリークされるためです(名前付き関数は、関数宣言のように周囲のスコープに関数名を追加しません—IE8以前を除いて[そしてそれだけではありません]彼らは彼らと間違えます])。checkcheckcheck

したがって、解決策は無名関数を使用して名前付き関数を非表示にすることです。

(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 に答える