javascript - 此 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
解决方案
此代码不包含竞争条件。请注意,事件侦听器附加到script
元素,而不是window
对象:
script.AddEventListener('load', function() { // ...
只有在脚本加载并执行后才会调用此函数。
即使事件侦听器已附加到window
对象,此代码仍不会包含竞争条件。该函数只会在所有window
的子资源被加载和执行后被调用,包括async
动态插入的任何脚本,就像这里发生的那样。
推荐阅读
- maven - 为什么 Gitlab 不能通过 CI 连接到仓库?
- c# - 如何让 WebGL 在这个实现中显示一个虚拟图像?
- c# - 在 ASP.NET Core 3.1 中处理多环境的 CORS 策略
- azure - 高级威胁防护 Rest API
- javascript - 是否可以在不使用切片的情况下限制数组中的项目数?
- java - 不是语句(for循环)
- python - How does assigning methods to each other work? ( " __call__ = __getattr__ " )
- java - How to save the previous result
- reactjs - MERN Stack 应用程序相同的数据出现在其他用户仪表板中
- php - 查询帖子标题以特定字母开头的 wp 帖子