-1

我使用了一个很好的技巧来检查是否存在带有函数的异步加载的 javascript 文件myFunction。诀窍是closure使用arguments.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 开发者网络,它还阻止了大量可能的优化。

另一种方法是为您的函数表达式命名并在 setTimeout 中使用该名称。该名称仅在函数内可见。

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