为什么在匿名函数中包装JavaScript库会修复我的竞争条件?
问题:为什么在匿名函数中包装JavaScript库会修复我的竞争条件? 注意:我还对同步和异步加载外部JavaScript资源的好解决方案的评论感兴趣 我正在从事一个项目,该项目涉及使用crossrider编写浏览器扩展。如果您不熟悉用JavaScript实现的cross rider扩展,那么您有一个可以与应用程序页面通信的背景页面。应用程序页面可以与每个打开的选项卡一起运行,并且可以操作DOM。我计划在用户请求打开时远程加载大部分扩展代码。最近,我在页面中添加了一个脚本标记,然后我构建了一些东西,结果遇到了竞争条件 据我所知,如果页面加载的脚本标记已经就位,那么执行将同步进行,尽管由于我添加了脚本标记,执行是异步进行的。这是大多数人似乎都有的相反的问题。混淆视听后,我了解到将代码graffle代码包装在匿名函数中修复了我的竞争条件。为什么?我在上读到这篇文章,这似乎与比赛条件无关。 我的电话号码:为什么在匿名函数中包装JavaScript库会修复我的竞争条件?,javascript,asynchronous,anonymous-function,race-condition,Javascript,Asynchronous,Anonymous Function,Race Condition,问题:为什么在匿名函数中包装JavaScript库会修复我的竞争条件? 注意:我还对同步和异步加载外部JavaScript资源的好解决方案的评论感兴趣 我正在从事一个项目,该项目涉及使用crossrider编写浏览器扩展。如果您不熟悉用JavaScript实现的cross rider扩展,那么您有一个可以与应用程序页面通信的背景页面。应用程序页面可以与每个打开的选项卡一起运行,并且可以操作DOM。我计划在用户请求打开时远程加载大部分扩展代码。最近,我在页面中添加了一个脚本标记,然后我构建了一些东
var scriptsToLoad = [ "http://example/Scripts/lib/raphael.js",
"http://example/Scripts/lib/graffle.js",
"http://example/Scripts/lib/log4javascript.js"];
for(var i in scriptsToLoad) {
(function(){
$("head")
.append($("<script></script>")
.attr("type", "text/javascript")
.attr("src", scriptsToLoad[i]));
})()
}
var scriptsToLoad=[”http://example/Scripts/lib/raphael.js",
"http://example/Scripts/lib/graffle.js",
"http://example/Scripts/lib/log4javascript.js"];
for(scriptsToLoad中的变量i){
(功能(){
$(“总目”)
.append($(“”)
.attr(“类型”、“文本/javascript”)
.attr(“src”,scriptsToLoad[i]);
})()
}
关于您的问题,我不认为有任何特定的标准规定了
标签的加载和评估顺序;引入比赛条件很容易
关于(a)同步脚本加载,请使用jQuery执行以下操作:
var scriptsToLoad = [
"http://example/Scripts/lib/raphael.js",
"http://example/Scripts/lib/graffle.js",
"http://example/Scripts/lib/log4javascript.js"
];
$.each(scriptsToLoad, function (index, script) {
$.ajax({
url : script,
async : false,
dataType : 'script'
});
});
可能与您的问题无关:如果您在中使用
for..遍历一个数组,您还将访问length
属性。检查是否要用src=“3”
附加
元素。您应该使用for
,而不是for..in
(但是如果使用if(scriptsToLoad.hasOwnProperty(i)){}
wrapper.@AtesGoral这不是真的;length
属性不可枚举。您的建议仍然合理,原因还有两个:性能,以及有人向阵列原型添加了其他垃圾的可能性。仅仅因为竞争条件不再具有可见症状并不意味着它已“修复”.您尝试“解决”的问题可能有多种原因问题在于,除非您能从ecma脚本标准或其他文档中找到一些理由,否则我不确定您如何确定竞争条件真的消失了。您在各种浏览器中看到了相同的结果吗?附议davmac的评论。竞争条件的行为定义取决于确切的交错运行时的事件数量,而不仅仅是代码所说的。竞争条件错误有时会发生,有时不会。我尊敬的主管曾经说过,不可能从程序中调试竞争条件,您必须知道您的设计确保没有竞争条件。关键是将async
标志设置为false
使每个脚本的请求同步。当数据类型
标志为script
时,jQuery将在加载脚本时自动全局评估脚本。如果可以异步加载脚本,只需使用$.getScript(script)
只是一个注释,但未动态添加到DOM中的脚本标记实际上会阻塞并按顺序加载。我真的不知道在闭包中向文档添加
标记应该完成什么。在我看来,似乎有人注意到这样做与加载的脚本之间存在正相关正确的顺序,但未能确定原因,并作出了一些不正确的假设。