Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在匿名函数中包装JavaScript库会修复我的竞争条件?_Javascript_Asynchronous_Anonymous Function_Race Condition - Fatal编程技术网

为什么在匿名函数中包装JavaScript库会修复我的竞争条件?

为什么在匿名函数中包装JavaScript库会修复我的竞争条件?,javascript,asynchronous,anonymous-function,race-condition,Javascript,Asynchronous,Anonymous Function,Race Condition,问题:为什么在匿名函数中包装JavaScript库会修复我的竞争条件? 注意:我还对同步和异步加载外部JavaScript资源的好解决方案的评论感兴趣 我正在从事一个项目,该项目涉及使用crossrider编写浏览器扩展。如果您不熟悉用JavaScript实现的cross rider扩展,那么您有一个可以与应用程序页面通信的背景页面。应用程序页面可以与每个打开的选项卡一起运行,并且可以操作DOM。我计划在用户请求打开时远程加载大部分扩展代码。最近,我在页面中添加了一个脚本标记,然后我构建了一些东

问题:为什么在匿名函数中包装JavaScript库会修复我的竞争条件?

注意:我还对同步和异步加载外部JavaScript资源的好解决方案的评论感兴趣

我正在从事一个项目,该项目涉及使用crossrider编写浏览器扩展。如果您不熟悉用JavaScript实现的cross rider扩展,那么您有一个可以与应用程序页面通信的背景页面。应用程序页面可以与每个打开的选项卡一起运行,并且可以操作DOM。我计划在用户请求打开时远程加载大部分扩展代码。最近,我在页面中添加了一个脚本标记,然后我构建了一些东西,结果遇到了竞争条件

据我所知,如果页面加载的脚本标记已经就位,那么执行将同步进行,尽管由于我添加了脚本标记,执行是异步进行的。这是大多数人似乎都有的相反的问题。混淆视听后,我了解到将代码graffle代码包装在匿名函数中修复了我的竞争条件。为什么?我在上读到这篇文章,这似乎与比赛条件无关。

我的电话号码:

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中的脚本标记实际上会阻塞并按顺序加载。我真的不知道在闭包中向文档添加
标记应该完成什么。在我看来,似乎有人注意到这样做与加载的脚本之间存在正相关正确的顺序,但未能确定原因,并作出了一些不正确的假设。