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

TMB*_*TMB 5 javascript asynchronous anonymous-function race-condition

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

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

我正在开发一个涉及使用crossrider编写浏览器扩展的项目.如果您不熟悉跨骑手扩展,他们是用JavaScript实现的,那么您有一个可以与应用页面通信的后台页面.应用页面可以与每个打开的选项卡一起运行,并可以操作DOM.我计划在用户请求打开时远程加载大部分扩展代码.最近,当我向引用Raphael的页面添加脚本标签时,我遇到了竞争状态,然后我用graffle构建一些东西

根据我的理解,如果页面加载了那些已经存在的脚本标签,那么执行将同步进行,但是因为我附加了脚本标签,所以执行是异步进行的.这是大多数人似乎面临的相反问题.搞乱它我学会了在匿名函数中包装我的代码graffle代码修复了我的竞争条件.为什么?我读过这篇关于在匿名函数中包装整个Javascript文件的帖子,这似乎与竞争条件没有任何关系.

我的通话代码:

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]));
    })()
}
Run Code Online (Sandbox Code Playgroud)

Dyl*_*lon 2

<script />关于你的问题,我不认为标签的加载和评估顺序有任何特定的标准;引入竞争条件很容易。

关于(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'
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 只是一条注释,但“不”动态添加到 DOM 的脚本标签实际上会阻塞并按顺序加载。 (4认同)