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

时间:2018-06-15 11:44:52

标签: javascript browser deferred-execution dynamic-script-loading

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

SendInput(6, in, sizeof(INPUT));

在异步脚本(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行失败了?

1 个答案:

答案 0 :(得分:-1)

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

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

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

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