代码之家  ›  专栏  ›  技术社区  ›  Flimm D. Ben Knoble

这个漏斗代码包含竞赛条件吗?

  •  -1
  • Flimm D. Ben Knoble  · 技术社区  · 7 年前

    我正在研究跟踪我遇到的脚本。这是一个由漏斗。乍一看好像有个虫子:

    (function(funnel) {
        var insert = document.getElementsByTagName('script')[0],
            script = document.createElement('script');
        script.addEventListener('load', function() {
            window.funnelytics.init(funnel, false);
        });
        script.src = 'https://cdn.funnelytics.io/track.js';
        script.type = 'text/javascript';
        script.async = true;
        insert.parentNode.insertBefore(script, insert);
    })('8889dbc2-6c2f-5ba4-c201-dc8889dbc26c');
    

    是否有可能 load 将在异步脚本之前调用 track.js 被处决?在这种情况下,行不行吗 window.funnelytics.init 失败,因为 window.funnelytics 还没有定义?

    1 回复  |  直到 7 年前
        1
  •  -1
  •   Flimm D. Ben Knoble    7 年前

    这个代码可以 包含竞赛条件。注意,事件侦听器附加到 script 元素,而不是 window 对象:

    script.AddEventListener('load', function() { // ...
    

    此函数只在脚本加载并执行后调用。

    即使事件侦听器已附加到 窗口 对象,此代码仍不包含竞赛条件。函数只会被调用一次 窗口 加载并执行的子资源,包括 async 动态插入的脚本,如下所示。

    推荐文章