Javascript使用closure和arguments.callee检查函数是否存在

时间:2013-02-03 17:31:03

标签: javascript recursion closures

我使用一个很好的技巧来检查是否存在具有函数myFunction的异步加载的javascript文件。诀窍是closure使用arguments.callee

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

这是最好的方法吗?使用arguments.callee浏览器兼容性是否存在任何问题?

感谢。

2 个答案:

答案 0 :(得分:2)

首先,您不应该轮询功能的存在。如果可能,您应该监视加载脚本时触发的事件。有关如何监控动态加载脚本的加载情况,请参阅this article,您可以通过Google轻松找到其他示例。

如果脚本是通过<script>标记加载的,并且它不是异步或延迟,那么它将以同步方式加载,以便后面的任何代码都可以安全地访问该脚本。


虽然最好使用在加载脚本时触发的实际事件(这就是你应该弄清楚如何做的事情),但你可以像arguments.callee这样断开你的技术:< / p>

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

停止使用arguments.callee的一个很好的理由是它在ECMA5严格模式下不存在。


如果您想为如何加载带有此函数的脚本提供一些上下文,那么我们可能会为您提供一些选项,以便更好地了解它何时被加载,因为轮询肯定不是最好的方式。

答案 1 :(得分:0)

arguments.callee()在严格模式下是不允许的,似乎不推荐使用。根据Mozilla开发者网络,它还可以防止大量可能的优化。

另一种方法是给你的函数表达式一个名字,并在setTimeout中使用它。该名称只能在函数中显示。

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