-1

関数を含む非同期ロードされた JavaScript ファイルがmyFunction存在するかどうかを確認するために、私は素晴らしいトリックを使用しています。トリックはclosureusingarguments.calleeです:

(function() {
  if(typeof myFunction === "undefined") {
    console.log("not loaded");
    setTimeout(arguments.callee, 100);
  } else {
    console.log("loaded");
  }
})();

これはこれを行う最良の方法ですか?を使用したブラウザの互換性に問題はありますarguments.calleeか?

ありがとう。

4

2 に答える 2

2

まず、関数の存在をポーリングしないでください。可能であれば、スクリプトがロードされたときにトリガーされるイベントを監視する必要があります。動的に読み込まれるスクリプトの読み込みを監視する方法については、この記事を参照してください。Google で他の例を簡単に見つけることができます。

スクリプトがタグを介してロードされ、<script>非同期でも遅延でもない場合、スクリプトは同期的にロードされるため、その後のコードはそのスクリプトに安全にアクセスできます。


スクリプトがロードされたときにトリガーされる実際のイベントを使用する方が良いでしょうが (実際には、その方法を理解する必要があります)、次のarguments.calleeようにテクニックを引き離すことができます。

(function() {
  function check() {
    if(typeof myFunction === "undefined") {
      console.log("not loaded");
      setTimeout(check, 100);
    } else {
      console.log("loaded");
    }
  }
  check();
})();

使用をやめる正当な理由arguments.calleeは、ECMA5 厳格モードには存在しないことです。


この関数を含むスクリプトがどのようにロードされているかについて何らかのコンテキストを提供したい場合は、ポーリングが最善の方法ではないため、スクリプトがいつロードされたかを知るためのより良い方法を提供できる可能性があります。

于 2013-02-03T17:38:46.550 に答える
0

arguments.callee() は厳密モードでは許可されておらず、推奨されていないようです。Mozilla Developer Network によると、多数の可能な最適化も妨げられます。

別のアプローチは、関数式に名前を付けて、setTimeout でその名前を使用することです。名前は、関数内からのみ表示されます。

(function pollingFunction() {
  if(typeof myFunction === "undefined") {
    console.log("not loaded");
    setTimeout(pollingFunction, 100);
  } else {
    console.log("loaded");
  }
})();
于 2013-02-03T17:54:47.157 に答える