我正在研究跟踪我遇到过的脚本。这是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
行失败了?
答案 0 :(得分:-1)
此代码不包含竞争条件。请注意,事件侦听器附加到script
元素,而不是window
对象:
script.AddEventListener('load', function() { // ...
只有在脚本加载并执行后才会调用此函数。
即使事件监听器已附加到window
对象,此代码仍不包含竞争条件。只有在加载并执行所有window
的子资源时才会调用该函数,包括动态插入的任何async
脚本,如此处所示。