Javascript jQuery.ready()和<;之间的交互;脚本延迟>;

Javascript jQuery.ready()和<;之间的交互;脚本延迟>;,javascript,jquery,deferred-loading,Javascript,Jquery,Deferred Loading,我试图找出我继承的一些代码的问题 我有一个带有 file1.js已被删除 FOO={ init:函数(){ var bar=bar; } } $(document).ready(FOO.init); file2.js已经发布 var条={ } 由于元素上的defer属性,可以安全地假设当.ready()调用FOO.init()时,BAR可能在该点b/c仍然未定义file2.js中的代码由于延迟执行而尚未执行吗 这将匹配我试图追踪的一个bug(只在IE中偶尔出现),但我真的想在我着手解决之

我试图找出我继承的一些代码的问题

我有一个带有


file1.js已被删除

FOO={
init:函数(){
var bar=bar;
}
}
$(document).ready(FOO.init);
file2.js已经发布

var条={
}
由于元素上的defer属性,可以安全地假设当
.ready()
调用
FOO.init()
时,
BAR
可能在该点b/c仍然未定义
file2.js
中的代码由于延迟执行而尚未执行吗

这将匹配我试图追踪的一个bug(只在IE中偶尔出现),但我真的想在我着手解决之前理解为什么会发生这种情况。我不知道为什么最初的开发人员使用了
延迟
,除了一个关于“他必须”这样做的神秘的赞扬。

在javascript中,浏览器优先考虑何时解释脚本,在一些最佳条件下,例如使用chrome,在加载页面时下载脚本,然后解析和解释。如果像上面那样使用defer,则永远无法确定先加载哪个脚本或解释何时完成

BAR
可能在一次页面加载时未定义,在重新加载(缓存)时定义,或者先加载第二个脚本


要测试这一点,请尝试更改其中一个脚本以强制进行新的下载和解释,并查看存在哪些竞争条件。

延迟应导致将脚本添加到页面完全加载后处理的队列中。根据规范,延迟脚本应该按照它们进入页面的顺序添加到队列中

然而,不同的浏览器对顺序的处理略有不同。IE似乎按照完成加载的顺序而不是页面上出现的顺序运行延迟脚本。因此,您偶尔会看到错误,因为有时它会以正确的顺序加载它们,有时则不会


请访问hacks.mozilla.com,了解不同浏览器如何处理延迟队列排序的更详尽的解释和示例。

没有答案,但我同情你,伙计。你理解
延迟属性吗因为在我看来,这是一件非常常见的事情…我猜最初的开发人员希望在file1.js和file2.js之前加载另一个脚本(或者他不知道$(document).ready()…@DanielRibeiro,我了解在上记录的关于它的内容,但我从未使用过它。嗯,根据文档,
…由于此功能(延迟)尚未在所有其他主要浏览器中实现,作者不应假设脚本的执行将实际延迟。
这意味着等待加载文档,而不是某些特定脚本。