此 Funnelytics 代码是否包含竞争条件?

Does this Funnelytics code contain a race condition?

我正在研究我遇到的跟踪脚本。这是 Funnelytics 的一个。乍一看似乎有错误:

(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 尚未定义吗?

此代码包含竞争条件。请注意,事件侦听器附加到 script 元素,而不是 window 对象:

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

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

即使事件侦听器已附加到 window 对象,此代码仍不会包含竞争条件。只有在 window 的所有子资源都已加载并执行后才会调用该函数,包括动态插入的任何 async 脚本,如此处发生的那样。