首页 > 解决方案 > 此 Funnelytics 代码是否包含竞争条件?

问题描述

我正在研究我遇到的跟踪脚本。这是 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

标签: javascriptbrowserdeferred-executiondynamic-script-loading

解决方案


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

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

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

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


推荐阅读