此 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
脚本,如此处发生的那样。
我正在研究我遇到的跟踪脚本。这是 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
脚本,如此处发生的那样。