Javascript 这个漏斗形代码是否包含竞争条件?

Javascript 这个漏斗形代码是否包含竞争条件?,javascript,browser,deferred-execution,dynamic-script-loading,Javascript,Browser,Deferred Execution,Dynamic Script Loading,我正在研究跟踪我遇到的脚本。这是漏斗队的。乍一看,它似乎有一个bug: (function(funnel) { var insert = document.getElementsByTagName('script')[0], script = document.createElement('script'); script.addEventListener('load', function() { window.funnelytics.init(f

我正在研究跟踪我遇到的脚本。这是漏斗队的。乍一看,它似乎有一个bug:

(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');

在异步脚本
track.js
执行之前,是否有可能调用由
load
触发的函数?在这种情况下,行
window.funnelytics.init
是否会失败,因为
window.funnelytics
尚未定义?

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

script.AddEventListener('load', function() { // ...
只有在加载并执行脚本后,才会调用此函数

即使事件侦听器已附加到
窗口
对象,此代码仍不包含竞争条件。只有在加载并执行所有
窗口
的子资源(包括任何动态插入的
异步
脚本)后,才会调用该函数,如下所示