我使用一个很好的技巧来检查是否存在具有函数myFunction
的异步加载的javascript文件。诀窍是closure
使用arguments.callee
:
(function() {
if(typeof myFunction === "undefined") {
console.log("not loaded");
setTimeout(arguments.callee, 100);
} else {
console.log("loaded");
}
})();
这是最好的方法吗?使用arguments.callee
浏览器兼容性是否存在任何问题?
感谢。
答案 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");
}
})();