我正在研究跟踪我遇到的脚本。这是一个由漏斗。乍一看好像有个虫子:
(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 还没有定义?
load
track.js
window.funnelytics.init
window.funnelytics
这个代码可以 不 包含竞赛条件。注意,事件侦听器附加到 script 元素,而不是 window 对象:
script
window
script.AddEventListener('load', function() { // ...
此函数只在脚本加载并执行后调用。
即使事件侦听器已附加到 窗口 对象,此代码仍不包含竞赛条件。函数只会被调用一次 窗口 加载并执行的子资源,包括 async 动态插入的脚本,如下所示。
窗口
async